假设我有以下协议:
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个需要符合该协议的结构……我不想“复制/粘贴”
‘一致性(变量ID:整数,变量名称:字符串)
所以我创建了一个 协议扩展 :
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
发生这种情况是因为在可识别协议中,ID和名称仅是可获取的。现在,如果将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)。当然, 二传手是空的 。
我的问题是: 我必须在设置器中放入哪段代码? 因为如果我添加 self.id = newValue, 它会崩溃(递归)。
提前致谢。