2016-11-10 73 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是一個大腦殘骸。 –