swift. 扩展类添加属性_Swift-协议扩展-属性默认值

假设我有以下协议:

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, 它会崩溃(递归)。

提前致谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值