2016-08-25 10 views
8

Próbuję przekonwertować Swift 2.2 projektu Swift 3, a ja otrzymuję następujący błąd:- observeValueForKeyPath: ofObject: zmiana: kontekst: w Swift 3

Method 'observeValue(forKeyPath:ofObject:change:context:)' with Objective-C selector 'observeValueForKeyPath:ofObject:change:context:' conflicts with method 'observeValue(forKeyPath:of:change:context:)' from superclass 'NSObject' with the same Objective-C selector" for the function call 

Na mojej funkcji, której podpis brzmi:

func observeValue(forKeyPath keyPath: String?, ofObject: Any?, change: [String : Any]?, context: UnsafeMutableRawPointer?)." 

Czytałem informacje na Swift 3 Migration Guide stronie internetowej:

"Workaround: Add an @objc(objectiveC:name:) attribute before the implementation of the optional requirement with the original Objective-C selector inside."

Ale to nie jest cl Ucho do mnie, jak to faktycznie ma być stosowane w pliku źródłowym, i nic, co próbowałem do tej pory, nie działało pomyślnie.

Czy ktoś może wyjaśnić, jak ustawić to poprawnie?

Odpowiedz

16

Po prostu zacznij pisać observeValueFor... i Xcode zasugeruje Ci prawidłowe autouzupełnianie dla tego. Wybierz to i powinieneś być dobry.

Twoja funkcja następnie powinien wyglądać mniej więcej tak:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 
+1

nie działa (jak Swift 3.0.1) zobacz + odpowiedź Mark –

+0

Wygląda na to, że klasa ta musi być podklasą NSObject. Próbowałem to zrobić w singleton bez podklasy NSObject i nie działa. –

+0

@SunnyPatel tak, KVO działa tylko z podklasami NSObject (w rzeczywistości tylko z klasami zarządzanymi w środowisku wykonawczym Objc). – Cristik

17

To co (wreszcie) pracował dla mnie za pomocą Swift 3.0 w Xcode w wersji 8.0 (8A218a):

@objc 
override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {