Supposons que je dispose du protocole suivant :
protocol Identifiable {
var id: Int {get}
var name: String {get}
}
Et que j'ai les structures suivantes :
struct A: Identifiable {
var id: Int
var name: String
}
struct B: Identifiable {
var id: Int
var name: String
}
Comme vous pouvez le voir, j'ai dû me conformer au protocole Identifiable dans les structures A et B. Mais imaginez que j'ai N autres structures qui doivent se conformer à ce protocole... Je ne veux pas 'copier/coller' la conformité (var id : Int, var name : String)
Je crée donc un extension du protocole :
extension Identifiable {
var id: Int {
return 0
}
var name: String {
return "default"
}
}
Grâce à cette extension, je peux désormais créer une structure conforme au protocole Identifiable sans avoir à implémenter les deux propriétés :
struct C: Identifiable {
}
Le problème est que je ne peux pas donner de valeur à la propriété id ou à la propriété name :
var c: C = C()
c.id = 12 // Cannot assign to property: 'id' is a get-only property
Cela est dû au fait que, dans le protocole Identifiable, l'identifiant et le nom sont uniquement accessibles. Maintenant, si je change les propriétés id et name en {get set} J'obtiens l'erreur suivante :
Le type "C" n'est pas conforme au protocole "Identifiable".
Cette erreur se produit parce que je n'ai pas implémenté de setter dans l'extension de protocole... Je modifie donc l'extension de protocole :
extension Identifiable {
var id: Int {
get {
return 0
}
set {
}
}
var name: String {
get {
return "default"
}
set {
}
}
}
Maintenant, l'erreur disparaît, mais si je donne une nouvelle valeur à id ou à name, c'est la valeur par défaut qui est utilisée (getter). Bien entendu, le setter est vide .
Ma question est la suivante : Quel morceau de code dois-je placer à l'intérieur du setter ? Car si j'ajoute self.id = newValue il se bloque (récursif).
Merci d'avance.