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
子句声明扩展名,这让我觉得我认为这一切都是错误的。我错过了什么?
答案 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
。
同样,半开放范围有Range
和CountableRange
。
有关详情,请参阅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)
}
}
并删除该扩展名。