反转范围会导致类型不匹配

Reversing a Range results in Mismatching Types

我想用一个变量来保存通常是某个范围的东西,例如 Range<Int>,这样我就可以使用条件逻辑来改变循环的范围而无需 copy/pasting for 循环。例如:

let range = aNumber % 2 == 0 ? 0..<10 : (0..<10).reverse()
for i in range { /* for loop logic */ }

let range = ... 将导致错误:Result values in '? :' expression have mismatching types 'Range<Int>' and 'ReverseRandomAccessCollection<Range(Int)'。我猜想反转范围会导致相同类型的范围或至少一个协议或两者都值 inherit/implement 的东西,所以我可以声明 let range: SomeType = ...。我一直没能找到那个。有什么想法吗?

您可以使用 AnySequence 创建一个 "type-erased sequence" 它将操作转发到底层序列,隐藏底层 SequenceType:

的细节
let range = aNumber % 2 == 0
            ? AnySequence ( (0 ..< 10) )
            : AnySequence ( (0 ..< 10).reverse() )

for i in range { print(i) }

三元条件运算符中的两个表达式都有 相同类型 AnySequence<Int>,所以这是 range.

的类型

对于 Swift 3 及更高版本,将 reverse() 替换为 reversed()