假设我有以下规定:
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 中的可识别协议。但是想象一下,如果我还有 N 个结构需要符合这个协议... ... 我不想‘复制/粘贴’这个一致性(var id: Int,var name: String)
所以我创建了一个 协议扩展:
extension Identifiable {
var id: Int {
return 0
}
var name: String {
return "default"
}
}
通过这个扩展,现在我可以创建一个符合 Identiable 协议的结构,而不必实现两个属性:
struct C: Identifiable {
}
现在的问题是,我不能设置 id 属性或 name 属性的值:
var c: C = C()
c.id = 12 // Cannot assign to property: 'id' is a get-only property
之所以会发生这种情况,是因为在 Identity 协议中,id 和 name 只是可获取的。现在,如果我将 id 和 name 属性更改为 { get set },就会得到以下错误:
类型“ C”不符合协议“可识别”
发生这个错误是因为我没有在协议扩展中实现 setter... ... 所以我更改了协议扩展:
extension Identifiable {
var id: Int {
get {
return 0
}
set {
}
}
var name: String {
get {
return "default"
}
set {
}
}
}
现在这个错误消失了,但是如果我将一个新值设置为 id 或 name,它就会得到默认值(getter)。当然,塞特是空的。
我的问题是: 我必须在 setter 中放入哪段代码? 因为如果我添加 Id = newValue,它会崩溃(递归)。
先谢谢你。