Swift3中的范围

时间:2016-11-10 08:17:29

标签: swift range

我正在努力应对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] {

1 个答案:

答案 0 :(得分:0)

您可以使用CountableRangeCountableClosedRange来避免重复,因为一个可以转换为另一个:

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的整数和指针类型可用作边界   可数范围。