2016-11-10 9 views
0

私はSwift3の変更の1つに苦労しています。以前は.....<Rangeと扱っていましたが、今では1トンの新しい「サブレンジ」があります。私は両方の範囲のバリエーションを取る関数を持っていると思います。Swang3の範囲

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これは簡略化された質問ですので、 'subscript'の場合、あなたの解決策は動作しません。別のポインタがありますか? –

答えて

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の範囲で問題ありません。アップルのドキュメントから:

あなたは Strideableプロトコルに準拠し、それに関連するストライド型として整数を使用する任意のタイプのオーバー可算範囲を作成することができます。 デフォルトでは、Swiftの整数型とポインタ型は、有効範囲の範囲である として使用できます。

+0

それは、リンクされた答えでマーティンが指摘したものです。私は 'subscript'の重複を避けたかったのです。 –

+0

実際、マーティンが指摘したことは、 'Range'と' ClosedRange'のために別々のメソッドを定義できるということでした。これを行う際の問題は、それらのメソッドのすべてのコードを複製する必要があることです。 Countableバージョンを使用する利点は、一方を他方に変換して重複を避けることができることです。注意私は、 'subscript'メソッドの中にロジックがあるだけです。 – ganzogo

+0

しかし、実際には 'Countable [Closed] Range'で' subscript'の複製を使用しています。これは避けたいものです: - /この 'subscript'を両方の範囲の種類に対して1回だけ必要とします。このスウィフトは脳波です。 –