Swift: самый маленький проходимый цикл - PullRequest
0 голосов
/ 19 сентября 2018

Если lowerBound больше, чем upperBound, ваш код вылетит"0")) ...

for i in 1..<1 {}

Но это не так ...

for i in 1...0 {}

?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

В сообщении об ошибке сообщается ответ:

Невозможно сформировать Range с upperBound

Это правило only , котороеимеет значение.

Как сформированный диапазон не имеет отношения к этому правилу.Не имеет значения, является ли оператор, который формирует диапазон, ... или ..<.Все, что имеет значение, это то, что, когда мы пытаемся подчиниться оператору и создавать экземпляр диапазона, должно получиться, что верхняя граница не меньше нижней границы.

Ну, в 1..<1 верхняя границане меньше нижней границы.Так что это допустимый диапазон.

Это также «пустой» диапазон;это contains без целых чисел (ни 0, ни 1, ни 2, ни любое другое целое число).Но это все еще диапазон.

Теперь, если подумать, это очень ценная вещь.Это не выглядит ценным в вашем примере, потому что вы используете литералы.Но когда нижняя граница и верхняя граница происходят из переменных, очень хорошо, что lo..<hi не падает в угловом случае, когда lo и hi оказываются равными!В этом случае возникает лот , и по уважительным причинам.

Например, рассмотрим циклический перебор элементов массива.Если массив пуст, его indices равны (как вы уже догадались) 0..<0.Вы хотите, чтобы Legal циклически проходил через этот массив.Ничего не происходит , но это не незаконно.И это только то, что говорит это правило.

0 голосов
/ 19 сентября 2018

Первое выражает «начиная с 1 и увеличивая на единицу, если значение меньше единицы, включите его».Это набор без значений, но разумно сказать.

В последнем выражается «начиная с 1 и увеличивая на единицу, пока значение не станет равным 0, включите его».Это действительно набор всех положительных целых чисел, но на практике вы определенно не имели это в виду, и вместо этого оно явно определено как ошибка.

Другой способ сказать то же самое - рассмотретьпервый должен быть целыми числами, большими или равными 1, а также меньшими 1. Опять же, это пустой набор.

Последний является набором всех значений, большим или равным 1 и меньшим или равным0. Это также пустой набор, но почти наверняка не тот, что вы имели в виду, поэтому он определен как ошибка.

...