В примере bar
компилятор знает, что bar
равно 0..<5
. Но в примере self
компилятор не знает, что будет self
.
Теперь рассмотрим этот код:
for i in 0.0..<1.0 {}
Не компилируется. Почему бы и нет? Потому что само понятие циклирования через диапазон Double с for...in
не имеет смысла.
Что ж, в вашем коде компилятор не знает, что ваш Range (self
) не будет диапазоном Double. Вы должны гарантировать , что этого не будет. Таким образом, вы должны указать, что ваше расширение должно работать только тогда, когда диапазон является чем-то, для чего for...in
имеет смысл.
Вы могли бы сделать это, указав, что это будет диапазон Int или SignedInteger, но самый общий способ указать это, сказав, что ваш диапазон будет диапазоном Strideable.