2015-09-19 9 views
5

CollectionTypeに準拠した独自の型を作成しようとしています。 Swift 2.0で導入されたプロトコル拡張により、必要なインスタンスメソッドのサブセットのみを実装し、同時に他のすべてのメソッドを自動的に実装することが可能になりました。しかし、私が提供する必要があるメソッドの最小サブセットは何ですか?デフォルト実装のプロトコルに準拠した型のスウィフト最小実装

答えて

9

Indexableプロトコルを実装することが最低限必要なようです。ここでは一例であり、 プロパティ/メソッドのいずれも、コンパイラエラーを起こすことなく、省略することができない。

struct MyCollectionType : CollectionType { 

    var startIndex : Int { return 0 } 
    var endIndex : Int { return 3 } 

    subscript(position : Int) -> String { 
     return "I am element #\(position)" 
    } 
} 

SequenceTypeプロトコルは、デフォルトで実装されている:可変収集用

let coll = MyCollectionType() 
for elem in coll { 
    print(elem) 
} 
/* 
I am element #0 
I am element #1 
I am element #2 
*/ 

タイプは、下付き文字を読み書きする必要があります。

struct MyCollectionType : MutableCollectionType { 

    var startIndex : Int { return 0 } 
    var endIndex : Int { return 3 } 

    subscript(position : Int) -> String { 
     get { 
      return "I am element #\(position)" 
     } 
     set(newElement) { 
      // Do something ... 
     } 
    } 
} 

スウィフト3用

更新:CollectionTypeCollectionに改名されました、そして、あなたは(A New Model for Collections and Indicesを比較)「インデックスに移動し、」一つの追加方法 実装する必要があります。

struct MyCollectionType : Collection { 

    var startIndex : Int { return 0 } 
    var endIndex : Int { return 3 } 

    subscript(position : Int) -> String { 
     return "I am element #\(position)" 
    } 

    func index(after i: Int) -> Int { 
     guard i != endIndex else { fatalError("Cannot increment endIndex") } 
     return i + 1 
    } 
} 
+0

おかげでたくさん!しかし、 'SequenceType'のような他のケースはどうでしょうか?これを理解するための一般的な方法はありますか? –

+0

@Peter:それは面白い質問ですが、私は一般的な答えはありません。私が単純にしたことは、空の実装である 'struct ABC:CollectionType {}'から始め、レポートナビゲータでコンパイラのメッセージを調べることです。最初のエラーは* "エラー:タイプ 'ABC'がプロトコル 'Indexable' *に準拠していません。そのアプローチが一般的に機能するかどうかはわかりません。 –

関連する問題