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}
可以看出,我必须“符合”struct A和struct B中的IDentifiable协议.但是想象一下,如果我有N个更多的结构需要符合这个协议…我不想“复制/粘贴’一致性(var ID:Int,var name:String)
所以我创建一个协议扩展:
extension IDentifiable { var ID: Int { return 0 } var name: String { return "default" }}
现在有了这个扩展,我可以创建一个符合可识别协议的结构,而不必实现这两个属性:
struct C: IDentifiable {}
现在的问题是我不能为ID属性或name属性设置一个值:
var c: C = C()c.ID = 12 // Cannot assign to property: 'ID' is a get-only property
发生这种情况是因为在可识别协议中,ID和name只是gettable.现在,如果我将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它崩溃(递归).
提前致谢.
解决方法 看来你想通过协议扩展将一个存储的属性添加到类型.但是这是不可能的,因为扩展名不能添加存储的属性.我可以给你几个选择.
子类(面向对象编程)
最简单的方法(可能你已经想象过)使用类而不是结构体.
class IDentifiableBase { var ID = 0 var name = "default"}class A: IDentifiableBase { }let a = A()a.name = "test"print(a.name) // test
Cons: In this case your A class needs to inherit from
IDentifiableBase
and since in Swift theres is not multiple inheritance this will be the only class A will be able to inherit from.
组件(面向协议的编程)
这种技术在游戏开发中非常受欢迎
struct IDentifiableComponent { var ID = 0 var name = "default"}protocol HasIDentifiableComponent { var IDentifiableComponent: IDentifiableComponent { get set }}protocol IDentifiable: HasIDentifiableComponent { }extension IDentifiable { var ID: Int { get { return IDentifiableComponent.ID } set { IDentifiableComponent.ID = newValue } } var name: String { get { return IDentifiableComponent.name } set { IDentifiableComponent.name = newValue } }}
现在,您可以使您的类型符合IDentifiable简单的写作
struct A: IDentifiable { var IDentifiableComponent = IDentifiableComponent()}
测试
var a = A()a.name = "test"print(a.name) // test总结
以上是内存溢出为你收集整理的ios – Swift – 协议扩展 – 属性默认值全部内容,希望文章能够帮你解决ios – Swift – 协议扩展 – 属性默认值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)