2016-08-04 5 views
0

Unicorn 클래스 (NSObject에서 상속)를 관찰해야하지만 비즈니스상의 이유로 관측 가능한 속성을 갖기 위해 적절한 대응 프레임 워크를 사용할 수 없습니다. KVO로 폴백해야합니다 (신이 도와주세요).Swift 클래스에 정적 구조체를 포함하는 방법은 무엇입니까?

"stringly-typed"하지 않도록하려면 observableKeyPaths라는 정적 속성을 도입하여 실제로는 KOK-observable 인 모든 keyPath를 도트 표기법을 사용하여 제공 할 생각입니다.

예를 들어 보겠습니다. Unicorn 클래스는 KVO 될 수있는 status 속성을 가지고 있습니다. 이 구조체는 참조 할 수

struct UnicornObservableKeyPaths { 

    static let status = "status" 
} 

:

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

내가 이런 구조체 가지고 올 수 : 내 관찰자를 설정 될 때 그런 다음,이 같은 키 패스를 참조 할 것 쉽게 :

UnicornObservableKeyPaths.status 

그러나이 구조체를 클래스의 일부로 만들려면 어떻게해야합니까? 다음 나를 위해 작동하지 않습니다 :

class Unicorn { 

    dynamic private(set) var status: String 

    static let observableKeyPaths: UnicornObservableKeyPaths = UnicornObservableKeyPaths() 

} 

어떤 아이디어? 내가 여기서 무엇을 놓치고 있니? 나는 정적 property..I이 struct..why이

Unicorn.observableKeyPaths 

아니라 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

간단하다! 그냥 구조체를 포함하고 그게 다야! .. 나는 인스턴스 부분 인 구조체를 놓쳤다. 나쁘다. –

관련 문제