Swift - Protokollerweiterungen - Eigenschaftenstandardwerte
Nehmen wir an, ich habe das folgende Protokoll:
protocol Identifiable {
var id: Int {get}
var name: String {get}
}
Und ich habe die folgenden Strukturen:
struct A: Identifiable {
var id: Int
var name: String
}
struct B: Identifiable {
var id: Int
var name: String
}
Wie Sie sehen, musste ich mich an das Identifizierbare Protokoll in Struktur A und Struktur B anpassen. Aber stellen Sie sich vor, ich hätte N weitere Strukturen, die diesem Protokoll entsprechen müssen ... Ich möchte nicht kopieren / Einfügen 'der Konformität (var id: Int, var name: String)
So erstelle ich einprotocol extension:
extension Identifiable {
var id: Int {
return 0
}
var name: String {
return "default"
}
}
it dieser Erweiterung kann ich jetzt eine Struktur erstellen, die dem Identifizierbaren Protokoll entspricht, ohne beide Eigenschaften implementieren zu müsse
struct C: Identifiable {
}
Nun, das Problem ist, dass ich keinen Wert für die Eigenschaft id oder die Eigenschaft name festlegen kann:
var c: C = C()
c.id = 12 // Cannot assign to property: 'id' is a get-only property
Dies geschieht, weil im Identifizierbaren Protokoll ID und Name nur abrufbar sind. Jetzt, wenn ich die ID- und Namenseigenschaften in @ ände {fertig} Ich erhalte den folgenden Fehler:
Typ 'C' entspricht nicht dem Protokoll 'Identifizierbar'
Dieser Fehler tritt auf, weil ich in der Protokollerweiterung keinen Setter implementiert habe ... Also ändere ich die Protokollerweiterung:
extension Identifiable {
var id: Int {
get {
return 0
}
set {
}
}
var name: String {
get {
return "default"
}
set {
}
}
}
Nun verschwindet der Fehler, aber wenn ich einen neuen Wert auf id oder name setze, erhält er den Standardwert (getter). Na sicher,der Setter ist leer.
Meine Frage ist:Welchen Code muss ich in den Setter einfügen? Denn wenn ich @ hinzufüg self.id = newValue es stürzt ab (rekursiv).
Danke im Voraus