反转范围会导致不匹配的types

我想使用一个variables来保存通常是某个范围的东西,例如Range<Int> ,这样我就可以使用条件逻辑来改变循环的范围而不需要复制/粘贴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)' Result values in '? :' expression have mismatching types 'Range<Int>' and 'ReverseRandomAccessCollection<Range(Int)' 。 我会猜测,反转范围将导致相同types的范围或至less一个协议或两个值inheritance/实现的东西,所以我可以声明let range: SomeType = ... 虽然我一直没有find。 有任何想法吗?

您可以使用AnySequence创build一个“types擦除序列”,将操作转发到基础序列,隐藏基础SequenceType的细节:

 let range = aNumber % 2 == 0 ? AnySequence ( (0 ..< 10) ) : AnySequence ( (0 ..< 10).reverse() ) for i in range { print(i) } 

三元条件运算符中的两个expression式都具有相同的typesAnySequence<Int> ,所以这是range的types。

对于Swift 3和更高版本,用reverse()replacereverse() reversed()