如何在Swift类中嵌入静态结构?

时间:2016-08-04 15:20:17

标签: swift foundation

我需要观察一个Unicorn类(继承自NSObject),但出于商业原因,我不能使用适当的反应框架来获得可观察的属性。 我必须回到KVO(上帝帮助我)。

为了使NOT" stringly-typed",我有一个想法是引入一个名为observableKeyPaths的静态属性,它将为Unicorn类提供所有实际为KVO可观察的keyPath ...使用dot符号

让我们举个例子。 Unicorn类具有可以是KVOed的属性status。 然后当我设置我的观察者时,我想要像这样引用keypath:

   unicornInstance.addObserver(self, forKeyPath: Unicorn.observableKeyPaths.status   ...etc..)

我可以想出一个像这样的结构:

struct UnicornObservableKeyPaths {

    static let status = "status"
}

可以轻松引用此结构:

UnicornObservableKeyPaths.status

但是如何让这个结构成为该类的一部分呢? 以下内容对我不起作用:

class Unicorn {  

   dynamic private(set) var status: String

   static let observableKeyPaths: UnicornObservableKeyPaths = UnicornObservableKeyPaths()

} 

有什么想法吗?我在这里错过了什么? 当我引用静态属性时......我可以访问这个

Unicorn.observableKeyPaths

但不是struct..why的status静态成员?

1 个答案:

答案 0 :(得分:0)

您无法引用静态属性,因为UnicornObservableKeyPaths()是实际UnicornObservableKeyPathsstatus是静态变量。

您可以使用

引用结构本身
static let observableKeyPaths = UnicornObservableKeyPaths.self
let _ = Unicorn.observableKeyPaths.status

您可以将结构嵌套在类

class Unicorn : NSObject {
    dynamic private(set) var status: String = ""

    struct ObservableKeyPaths {

        static let status = "status"
    }
}

您的观察示例如下所示:

let unicornInstance = Unicorn()
unicornInstance.addObserver(self, forKeyPath: Unicorn.ObservableKeyPaths.status, options: [], context: nil)