2016-08-04 3 views
0

Мне нужно наблюдать класс Unicorn (наследуется от NSObject), но по коммерческим соображениям я не могу использовать правильную реактивную структуру, чтобы иметь наблюдаемые свойства. Мне нужно отступить к КВО (бог помоги мне).Как вставить статическую структуру в класс Swift?

Чтобы сделать вещи НЕ «строгими», у меня есть идея ввести статическое свойство, называемое наблюдаемымKeyPaths, которое предоставит все ключевые блоки, которые на самом деле являются KVO-наблюдаемыми для класса Unicorn ... с использованием точечной нотации.

Приведем пример. Класс Unicorn имеет свойство status, которое может быть KVOed. Тогда, когда я был бы создание моего наблюдателя, я хотел бы сослаться на ключевом пути, как это:

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 

но не status статического члену struct..why?

+2

Do вы знаете о записи 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

Sooo просто! Просто включите структуру и все! .. Я пропустил структуру, являющуюся частью экземпляра .. плохой. –

Смежные вопросы