swift – 如何在协议扩展中存储提交给计算属性的数据?
在我目前正在开发的应用程序中,我尝试利用
Swift中的新协议扩展功能.我的想法是我有很多类实现相同的协议.由于所有这些类都应该具有相同的计算属性,并且由于属性在不同的类中应该表现相同,所以我认为仅添加一次功能会很好.
我的代码结构如下 protocol SomeProtocol { ... } // There could potentially be unlimited different versions of "SomeClass" that implements "SomeProtocol" class SomeClass : SomeProtocol { ... } extension SomeProtocol { var computedProperty1: Type? { get { getData(SOME_ENUM) } set { validateAndSave(newValue,atKey: SOME_ENUM) } } var computedProperty2: Type? { get { getData(SOME_OTHER_ENUM) } set { validateAndSave(newValue,atKey: SOME_OTEHR_ENUM) } } ... func getData(atKey: ENUM_TYPE) -> Type? { [NEED SOME WAY TO GET THE SAVED DATA AND RETURN IT] } func validateAndSave(value: Type?,atKey: ENUM_TYPE) { [NEED SOME WAY TO SAVE DATA FOR LATER RETURNING] } } // The properties needs to be visible to the client code like this: class ClientCode { let someClassObject: SomeProtocol = SomeClass() someClassObject.computedProperty1 = Type() print(someClassObject.computedProperty1) } (上面的代码显示了将数据存储在不同字典中的迹象,这是我的第一个想法) 问题是扩展不支持存储的属性.但是,我在哪里/如何存储提交给计算属性的数据呢? 我可以想到两种不同的解决方案,但它们都不好…… >我可以将扩展转换为实现SomeProtocol的类,然后使SomeClass成为它的子类.这将允许我将数据保存在存储的属性中.但是它还需要我实现协议在新类中所需的所有方法 – 这绝对没有意义,因为SomeClass的不同版本应该提供不同的功能. 是否有一些我忽略的完全简单的逻辑解决方案? …或者在我不知道的协议扩展中保存数据的好方法? …或获得所需功能的其他方式? …或者我应该把它吸干并使用我不那么漂亮的解决方案之一? 解决方法
协议扩展?为什么?
有时我们会这么想,以至于我们忽略了一种盯着我们的实际解决方案. 你有一组计算属性吗?不,您想要存储的属性.
… 但后来
2.假设它是您想要的一组存储属性,您实际上自己提供了解决方案!做了一个现在有意义的改变.
您可以随时扩展该类,然后将其子类确认为SomeProtocol以获取这些功能.这比较干净. 另一方面,Swift的协议无法存储属性是设计的.协议本身并不存在,并且在其中添加存储的属性是没有意义的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |