【问题标题】:Reversing a Range results in Mismatching Types反转范围会导致类型不匹配
【发布时间】:2016-02-05 09:25:22
【问题描述】:

我想使用一个变量来保存通常是某个范围的东西,例如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&lt;Int&gt;' and 'ReverseRandomAccessCollection&lt;Range(Int)'。我猜想反转范围会导致相同类型的范围或至少是协议或两个值都继承/实现的东西,所以我可以声明let range: SomeType = ...。不过,我还没有找到。有什么想法吗?

【问题讨论】:

    标签: ios swift for-loop iterable type-mismatch


    【解决方案1】:

    您可以使用AnySequence 创建“类型擦除序列” 它将操作转发到底层序列,隐藏底层SequenceType的细节:

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

    三元条件运算符中的两个表达式都有 同类型AnySequence&lt;Int&gt;,所以是range的类型。

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

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      相关资源
      最近更新 更多