如何在协议扩展中存储提交到计算属性的数据?

Mor*_*nHC 5 swift swift2

在我目前正在开发的应用程序中,我尝试利用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)
}
Run Code Online (Sandbox Code Playgroud)

(上面的代码显示了将数据存储在不同字典中的迹象,这是我的第一个想法)

问题是扩展不支持存储的属性.但是,我在哪里/如何存储提交给计算属性的数据呢?

我可以想到两种不同的解决方案,但它们都不好......

  1. 我可以将扩展转换为实现的类,SomeProtocol然后创建SomeClass它的子类.这将允许我将数据保存在存储的属性中.但是它还需要我实现协议在新类中所需的所有方法 - 这绝对没有意义,因为它的不同版本SomeClass应该提供不同的功能.
  2. 我可以放弃整个扩展的想法,并将所有属性移动到SomeProtocol.但这需要我在SomeClass具有相同功能的所有不同版本中实现所有计算属性,并且我的扩展想法的重点是避免一遍又一遍地为相同的属性编写相同的实现.

是否有一些我忽略的完全简单的逻辑解决方案?

...或者在我不知道的协议扩展中保存数据的好方法?

...或获得所需功能的其他方式?

...或者我应该把它吸干并使用我不那么漂亮的解决方案之一?

avi*_*ara -1

协议扩展?为什么?

有时,我们过于执着于一个想法,以至于忽略了眼前的实际解决方案。

1. 你有一组计算属性吗?不,您想要存储的属性。

由于所有这些类都应该具有相同的计算属性,并且这些属性在不同的类中应该表现相同......

... 但后来

问题是扩展不支持存储的属性。但是,我该如何存储提交给计算属性的数据呢?

2. 假设它是您想要的一组存储属性,那么您几乎自己提供了解决方案!做了一项现在有意义的改变。

我可以将扩展转换为实现 SomeProtocol 的类,然后使 SomeClass 成为它的子类。这将允许我将数据保存在存储的属性中。

您可以随时扩展该类,然后确认其子类SomeProtocol以获得功能。这更干净。

顺便说一句,Swift 协议无法存储属性是设计使然。协议本身并不存在,并且在其中添加存储的属性是没有意义的。