2015-09-19 5 views
5

Ich versuche, meinen eigenen Typ zu CollectionType konform zu machen. Mit den in Swift 2.0 eingeführten Protokollerweiterungen ist es nun möglich, nur eine Teilmenge der benötigten Instanzmethoden zu implementieren und gleichzeitig alle anderen Methoden automatisch zu implementieren. Aber was ist die minimale Teilmenge der Methoden, die ich zur Verfügung stellen muss?Swift minimale Implementierung für Typen konform mit Protokollen mit Standardimplementierungen

Antwort

9

Es scheint, dass die Mindestanforderung darin besteht, das Indexable Protokoll zu implementieren. Hier ist ein Beispiel, und keines der Eigenschaften/Methoden ohne weggelassen werden können einen Compiler-Fehler verursacht:

struct MyCollectionType : CollectionType { 

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

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

Das SequenceType Protokoll standardmäßig implementiert ist:

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

Für eine wandelbar Sammlung Typ, der Index muss gelesen/geschrieben werden:

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 ... 
     } 
    } 
} 

Update für Swift 3:CollectionType hat Collection umbenannt wurde, und Sie haben eine zusätzliche Methode dem implementieren "bewegt sich der Index" (vergleiche 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

Vielen Dank! Aber wie wäre es mit anderen Fällen wie 'SequenceType'? Gibt es allgemeine Möglichkeiten, dies herauszufinden? –

+0

@Peter: Das ist eine interessante Frage, aber ich habe keine allgemeine Antwort. Ich habe einfach mit einer leeren Implementierung begonnen: 'struct ABC: CollectionType {}' und prüfe die Compiler-Nachrichten im Report-Navigator. Der erste Fehler war * "error: type 'ABC' entspricht nicht dem Protokoll 'Indexable'" *. Ich weiß nicht, ob dieser Ansatz überhaupt funktioniert. –

Verwandte Themen