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

How to embed a static struct in a Swift class?

我需要观察一个 Unicorn class(继承自 NSObject),但出于业务原因,我无法使用适当的反应式框架来获得可观察的属性。 我必须退回到 KVO(上帝保佑我)。

为了让事情不 "stringly-typed",我有一个想法,引入一个名为 observableKeyPaths 的静态 属性,它会为 Unicorn class 提供实际上是 KVO 可观察的所有 keyPaths ...使用点符号。

让我们举个例子。 Unicorn class 有一个 属性 status 可以 KVOed。 然后当我设置我的观察者时,我想像这样引用键路径:

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

我可以想出这样的结构:

struct UnicornObservableKeyPaths {

    static let status = "status"
}

这个结构很容易被引用:

UnicornObservableKeyPaths.status

但是如何使这个结构成为 class 的一部分? 以下对我不起作用:

class Unicorn {  

   dynamic private(set) var status: String

   static let observableKeyPaths: UnicornObservableKeyPaths = UnicornObservableKeyPaths()

} 

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

Unicorn.observableKeyPaths

但不是结构的 status 静态成员..为什么?

您不能引用静态变量 属性,因为 UnicornObservableKeyPaths() 是一个实际的 UnicornObservableKeyPathsstatus 是一个静态变量。

您可以使用

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

您可以将结构嵌套在 class

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)