反转范围会导致类型不匹配
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()
。
我想用一个变量来保存通常是某个范围的东西,例如 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()
。