2016-08-04 11 views
0

私はUnicornクラス(NSObjectから継承)を観察する必要がありますが、ビジネス上の理由から、私は観察可能なプロパティを持つために適切な反応フレームワークを使用することはできません。 私はKVOにフォールバックする必要があります(神は私を助けます)。Swiftクラスに静的構造体を埋め込む方法は?

私は、文字列型ではないことを確認するために、observableKeyPathsという静的プロパティを導入する考えがあります。これは、実際にはUnicodeクラスの... KVO観測可能なすべてのkeyPathを提供します。

例があります。 Unicornクラスには、KVOされるプロパティstatusがあります。 私はオブザーバーを設定することになるときに、私はこのようなキーパスを参照するとよいでしょう:

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() 

} 

任意のアイデア?私はここで何が欠けていますか? 私は静的property..Iを参照し、この

Unicorn.observableKeyPaths 

なくstruct..whyのstatus静的メンバにアクセスすることができますか?

+2

を実行します。 Swift 3 '#keyPath'表記について知っていますか? – matt

+0

私は今します。ありがとうございました。 –

答えて

0

UnicornObservableKeyPaths()が実際のUnicornObservableKeyPathsで、statusが静的​​変数であるため、静的プロパティを参照することはできません。

あなたは

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) 
+0

簡単です!構造体を含めればそれだけです! ..私は構造体がインスタンス部分であることを逃しました。私は悪いです。 –

関連する問題