私が次のプロトコルを持っているとしましょう:
protocol Identifiable {
var id: Int {get}
var name: String {get}
}
そして、私は次の構造体を持っています:
struct A: Identifiable {
var id: Int
var name: String
}
struct B: Identifiable {
var id: Int
var name: String
}
ご覧のとおり、構造体 A と構造体 B の Identifiable プロトコルに「準拠」する必要がありました。しかし、このプロトコルに準拠する必要がある構造体がさらに N 個あると想像してみてください... 「コピー/貼り付け」したくありません' 適合性 (var id: Int、var name: String)
だから私はプロトコル拡張機能を作成します:
extension Identifiable {
var id: Int {
return 0
}
var name: String {
return "default"
}
}
この拡張により、両方のプロパティを実装しなくても、Identifiable プロトコルに準拠する構造体を作成できるようになりました。
struct C: Identifiable {
}
問題は、id プロパティまたは name プロパティに値を設定できないことです。
var c: C = C()
c.id = 12 // Cannot assign to property: 'id' is a get-only property
これは、Identifiable プロトコルでは、id と name のみが取得可能であるために発生します。id プロパティと name プロパティを{get set}に変更すると、次のエラーが発生します。
タイプ「C」はプロトコル「識別可能」に準拠していません
このエラーは、プロトコル拡張にセッターを実装していないために発生します...そのため、プロトコル拡張を変更します。
extension Identifiable {
var id: Int {
get {
return 0
}
set {
}
}
var name: String {
get {
return "default"
}
set {
}
}
}
エラーはなくなりましたが、新しい値を id または name に設定すると、デフォルト値 (getter) が取得されます。もちろん、セッターは空です。
私の質問は次 のとおりです。セッター内に配置する必要があるコードはどれですか? self.id = newValueを追加するとクラッシュするため (再帰的)。
前もって感謝します。