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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage