В асимметрии этого есть что-то тревожное:
for i in (1..<5).reverse()
... в отличие от этого:
for i in 1..<5 {
Это означает, что каждый раз, когда я хочу сделать обратный диапазон, я должен не забыть поставить круглые скобки, плюс я должен написать это .reverse()в конце, торча, как больной палец. Это действительно некрасиво по сравнению с C-стилем для циклов, которые симметричны, считая вверх и вниз. Поэтому я предпочел использовать C-стиль для циклов. Но в Swift 2.2 цикл for в стиле C уходит! Поэтому мне пришлось поспешно заменить все мои декрементирующие циклы for в C-стиле этой уродливой .reverse()конструкцией - все время задаваясь вопросом, почему, черт возьми, нет оператора обратного диапазона?
Но ждать! Это Swift - нам разрешено определять собственные операторы !! Вот так:
infix operator >>> {
associativity none
precedence 135
}
func >>> <Pos : ForwardIndexType where Pos : Comparable>(end:Pos, start:Pos)
-> ReverseRandomAccessCollection<(Range<Pos>)> {
return (start..<end).reverse()
}
Итак, теперь я могу сказать:
for i in 5>>>1 {print(i)} // 4, 3, 2, 1
Это охватывает только наиболее распространенный случай , что происходит в моем коде, но это , несомненно, самый распространенный случай, так что это все нужно , я в настоящее время .
У меня был какой-то внутренний кризис с оператором. Я бы хотел использовать >.., как обратное ..<, но это незаконно: похоже, вы не можете использовать точку после точки, не являющейся точкой. Я подумал, ..>но решил, что это слишком сложно отличить ..<. Приятно то, >>>что он кричит на вас: « вниз !» (Конечно, вы можете придумать другого оператора. Но мой совет: для суперсимметрии определите <<<, что делать ..<, и теперь у вас есть <<<и>>> . , Которые симметричны и легко печатать)
Версия Swift 3 (Xcode 8 seed 6):
infix operator >>> : RangeFormationPrecedence
func >>><Bound>(maximum: Bound, minimum: Bound) ->
ReversedRandomAccessCollection<CountableRange<Bound>>
where Bound : Comparable, Bound.Stride : Integer {
return (minimum..<maximum).reversed()
}
Версия Swift 4 (Xcode 9 beta 3):
infix operator >>> : RangeFormationPrecedence
func >>><Bound>(maximum: Bound, minimum: Bound)
-> ReversedRandomAccessCollection<CountableRange<Bound>>
where Bound : Comparable & Strideable {
return (minimum..<maximum).reversed()
}
Версия Swift 4.2 (Xcode 10 beta 1):
infix operator >>> : RangeFormationPrecedence
func >>><Bound>(maximum: Bound, minimum: Bound)
-> ReversedRandomAccessCollection<Range<Bound>>
where Bound : Strideable {
return (minimum..<maximum).reversed()
}
Версия Swift 5 (Xcode 10.2.1):
infix operator >>> : RangeFormationPrecedence
func >>><Bound>(maximum: Bound, minimum: Bound)
-> ReversedCollection<Range<Bound>>
where Bound : Strideable {
return (minimum..<maximum).reversed()
}