2016-11-10 54 views
0

我正在为Swift3中的某个更改而苦苦挣扎。早些时候,他们将.....<作为Range,但现在他们有很多新的“子范围”。我想有一个功能同时适用于两个范围的变体。Swift3中的范围

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

这可能是你正在寻找的:http://stackoverflow.com/a/40377303/1187415。 –

+0

@MartinR正确:-)我喜欢它,当编译器设计师用一个至少需要博士学位的人替换一个简单的构造时: - | –

+0

@MartinR现在,由于这是一个简化的问题,我发现对于'下标'你的解决方案不起作用。你有另一个指针吗? –

回答

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

+0

这就是马丁在相关答案中指出的。我想避免'下标'的重复。 –

+0

实际上,Martin指出的是你可以为'Range'和'ClosedRange'定义单独的方法。这样做的问题是你将不得不复制这些方法中的所有代码。使用Countable版本的好处是可以将一个转换为另一个,从而避免重复。注意我只有一个'subscript'方法中有逻辑。 – ganzogo

+0

但实际上,您正在使用'Countable'的'subscript'与'Countable [Closed] Range'重复,这就是我想要避免的: - /我希望这个'subscript'对于这两个范围类型只有一次。这个Swift是一个大脑残骸。 –