##はじめに
お断りしておきますと、「Rangeを使ったforループは気をつけよう」で指摘されている問題は、Appleも把握してます。
More improvements are due in forthcoming betas, addressing a variety of issues iterating over floating point ranges, constructing negative ranges, and several other known range-related problems.
##Appleの対応を待てない人は
それを踏まえた上で、Appleの対応を待てない人向けの対策を。
@infix func ..< (lhs:Int, rhs:Int)->StrideTo<Int> {
return stride(from:lhs, to:rhs, by:(lhs <= rhs ? 1 : -1 ))
}
@infix func ... (lhs:Int, rhs:Int)->StrideThrough<Int> {
return stride(from:lhs, through:rhs, by:(lhs <= rhs ? 1 : -1 ))
}
動作確認用コード
for i in 0..<4 { println("0..<4: \(i)") }
for i in 4..<0 { println("4..<0: \(i)") }
for i in 0...4 { println("0...4: \(i)") }
for i in 4...0 { println("4...0: \(i)") }
本当は
@infix func ..< <T:Comparable>(lhs:Int, rhs:Int)->Range<T>
で定義したいところですが、それだと**ambiguous use of ..<**って怒られちゃうので、Non-GenericにInt
決めうちで。
見ての通り、..<
と...
もただの演算子なので、当然Overloadの対象だということも覚えておくといいかも。
Dan the Bidirectional