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
5
A
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
}
}
Verwandte Themen
- 1. Swift enum mehrere generische Typen mit abhängigen Protokollen
- 2. Optionale Verschlüsse in Swift-Protokollen
- 3. Minimale Repository-Implementierung mit Entity Framework
- 4. Swift Reihe von Protokollen mit associatedtype
- 5. Minimale Größe Implementierung für Bool-Array
- 6. null-sichere Zuordnung Vergleicher mit Standardimplementierungen
- 7. Vergleichen von Typen mit Swift
- 8. Versuchen, die Implementierung von Delegaten mit Protokollen in Swift zu verstehen
- 9. Ist diese Implementierung SQL-92-konform?
- 10. Grafik/Baum-Implementierung mit unvollständigen Typen
- 11. Verhalten von Protokollen mit Selbst
- 12. Implementierung von Grundoperationen für Typen Einbau-ohne libcore mit
- 13. Mehrere UITableViewCell Typen Implementierung
- 14. Minimale Implementierung von sprintf oder printf
- 15. Fehler mit Swift Generics und zugeordneten Typen
- 16. Swift: Schließen mit bekannten Typen Syntax
- 17. Kann nicht ein Array von Typen konform zu einem Protokoll in Swift
- 18. Swift generischer Typ, der zwei Protokollen entspricht
- 19. Entfernen alter Verzeichnisse mit Protokollen
- 20. Was wäre eine bessere Strategie für IBActions in Swift-Protokollen?
- 21. Sortieren von Protokollen mit Regex?
- 22. Swift 2 Protokollkonformität zu Protokollen hinzufügen
- 23. Minimale vollständige Definition Anmerkungen für Haskell
- 24. Swift Protokollerweiterungen für Value (Strukturen) Typen
- 25. Liste der Standardimplementierungen für @property Getter und Setter
- 26. SCIM 2.0 minimale Anforderung
- 27. Swift: Array-Eigenschaft mit Elementen zu einer Klasse und mehrere Protokollen entsprechen, gleichzeitig
- 28. ObjC Protokoll Implementierung in Swift
- 29. Swift Sortierung Algorithmus Implementierung
- 30. Minimale noweb Beispiel mit Querverweis
Vielen Dank! Aber wie wäre es mit anderen Fällen wie 'SequenceType'? Gibt es allgemeine Möglichkeiten, dies herauszufinden? –
@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. –