假设我有以下协议:
protocol Identifiable {
var id: Int {get}
var name: String {get}
}
我有以下 struct :
struct A: Identifiable {
var id: Int
var name: String
}
struct B: Identifiable {
var id: Int
var name: String
}
如你所见,我必须"遵守" struct A和 struct B中的可识别协议.但是想象一下,如果我还有N个 struct 需要遵守这个协议...我不想"复制/粘贴"一致性(变量id:Int,变量名称:String)
所以我创造了一个protocol extension:
extension Identifiable {
var id: Int {
return 0
}
var name: String {
return "default"
}
}
现在有了这个扩展,我可以创建一个符合可识别协议的 struct ,而不必实现两个属性:
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},则会出现以下错误:
Type 'C' does not conform to protocol 'Identifiable'
发生此错误是因为我没有在协议扩展中实现setter...所以我更改了协议扩展:
extension Identifiable {
var id: Int {
get {
return 0
}
set {
}
}
var name: String {
get {
return "default"
}
set {
}
}
}
现在错误消失了,但如果我将一个新值设置为id或name,它将获得默认值(getter).当然,the setter is empty.
我的问题是:
提前谢谢.