如何迭代一系列范围?

时间:2017-07-05 05:00:28

标签: swift

Swift 3的编译器不允许我编译以下内容:

let a = 0
let b = 10
var arr = [ClosedRange<Int>]()
let myRange: ClosedRange = a...b
arr.append(myRange)

for each in arr {
    for every in each {
        print(every)
    }
}

...由于ClosedRange<Int>不符合Sequence协议。在过去,像这样对类进行简单的扩展就足够了:

extension ClosedRange<Int>: Sequence {}

...但是现在编译器要求使用where子句声明扩展名,这让我觉得我认为这一切都是错误的。我错过了什么?

2 个答案:

答案 0 :(得分:4)

问题不是你有一系列范围,而是那个 Swift 3中的ClosedRange表示

  

可比类型的区间,从下限到上限,包括上限。

例如,封闭范围可以与Double

一起使用
let r: ClosedRange<Double> = 1.1...2.2

枚举所有可能的值没有多大意义。

您需要的是CountableClosedRange

  

形成连续值集合的闭合范围。

,特别是一个集合,可以迭代:

let a = 0
let b = 10
var arr = [CountableClosedRange<Int>]()
let myRange: CountableClosedRange = a...b
arr.append(myRange)

for each in arr {
    for every in each {
        print(every)
    }
}

你可以写

let myRange = a...b

因为默认情况下,...运算符会生成CountableClosedRange 如果它的操作数是Strideable

同样,半开放范围有RangeCountableRange。 有关详情,请参阅Range Types中的SE-0065 A New Model for Collections and Indices

答案 1 :(得分:1)

    let a = 0
    let b = 10
    var arr = [ClosedRange<Int>]()
    let myRange: ClosedRange = a...b
    arr.append(myRange)

    for each in arr {
        for every in [Int](each.lowerBound..<each.upperBound) {
            print(every)
        }
    }

并删除该扩展名。