我正在努力应对Swift3之一的变化。之前他们将...
和..<
视为Range
,但现在他们有了大量新的&#34;子范围&#34;。我希望有一个功能同时采用两种范围变体。
struct Test {
var data = [1,2,3,4,5]
subscript(r:Range<Int>) -> [Int] {
return Array(data[r])
}
}
let t = Test()
print(t[0...1]) // fails because now this is a ClosedRange
print(t[0..<2])
我想要
subscript(r:TakesAnyRange<Int>) -> [Int] {
答案 0 :(得分:0)
您可以使用CountableRange
和CountableClosedRange
来避免重复,因为一个可以转换为另一个:
struct Test {
var data = [1,2,3,4,5]
subscript(r: CountableRange<Int>) -> [Int] {
return Array(data[r])
}
subscript(r: CountableClosedRange<Int>) -> [Int] {
return self[CountableRange(r)]
}
}
这适用于Int
范围,这是您在问题中指定的范围。来自Apple文档:
您可以在符合条件的任何类型上创建可数范围 Strideable协议并使用整数作为其关联的Stride类型。 默认情况下,Swift的整数和指针类型可用作边界 可数范围。