2017-11-18 4 views
0

Ich denke, ein Teil meines Problems liegt darin, dass Swift 4 die Arbeitsweise von @objc verändert hat.Wie verwende ich #keyPath() in Swift 4?

Es gibt viele Tutorials, die herumschweben, mit vielen verschiedenen Werten, und ich kann mich nicht entscheiden, was in welcher Version funktioniert, um herauszufinden, wie man es in dieser Version funktioniert .

let delegate = UIApplication.shared.delegate as! AppDelegate 
    delegate.addObserver(self, forKeyPath: #keyPath(AppDelegate.session), options: [], context: nil) 
    //Warning: Argument of #keyPath refers to non-'@objc' property 'session' 

@objc Das Hinzufügen der var Erklärung teilt mir nur, dass APISession nicht in Ziel C. verwiesen werden, dass der Weg in Richtung erfordern mir jede Klasse/Variable zu belichten zu führen hinunter scheint, ich will dieses Tool verwenden mit Obj-C, und das scheint nur rückwärts - das ist eine neuere Funktion, wie ich es verstehe, und es ist nur seltsam, dass Apple würde es nicht nativ in Swift funktionieren. Was für mich bedeutet, dass ich irgendetwas falsch verstehe oder falsch anwende.

+1

Ich weiß, es fühlt sich an wie rückwärts gehen. Jede Observable muss von NSObject erben. –

+2

KVO erfordert, dass die Obj-C-Laufzeit ein Swizzling durchführt (und es wurde * immer * benötigt). Wenn Sie also eine Eigenschaft beobachten möchten, muss diese Eigenschaft '@objc dynamic' sein. Das einzige, was Swift 4 hier geändert hat, ist, dass '@ objc' an vielen Stellen nicht mehr * abgeleitet wird (vergleiche https://stackoverflow.com/q/44390378/2976878). Sie sollten in Erwägung ziehen, 'willSet' /' didSet' über KVO zu verwenden. – Hamish

+0

@Hamish der große Grund, warum ich mit KVO gehen wollte ist, weil mein Ziel war es, mir zu erlauben, den Wert einer Eigenschaft in meinem App-Delegate ('ist angemeldet') in einem View-Controller zu beobachten und bestimmte Ereignisse auszulösen, wenn sich der Login-Status ändert . Der fragliche ViewController befindet sich in der Nähe des Stamms meiner Struktur unterhalb meiner Login-Ansicht. Daher kann ich mich nicht auf didLoad verlassen, und ich möchte den betreffenden Code nicht auf willAppear auslösen. Ich wollte dem Delegierten keinen Delegierten geben, daher erschien mir das am einfachsten. In diesem Fall sieht es so aus, als müsste ich mich stattdessen über das Benachrichtigungscenter einklinken. – RonLugge

Antwort

1

Nach den docs:

In Objective-C, ist ein Schlüssel ein String, der eine spezifische Eigenschaft eines Objekts identifiziert. Ein Schlüsselpfad ist eine Zeichenfolge aus durch Punkte getrennten Schlüsseln, die eine Folge von Objekteigenschaften angeben, die durchlaufen werden sollen.

Deutlich wird die Diskussion von #keyPath wird in einem Abschnitt mit dem Titel "Zusammenarbeit mit Objective-C-APIs" gefunden. KVO und KVC sind Objective-C-Funktionen.

Alle Beispiele in den Dokumenten zeigen Swift-Klassen, die von NSObject erben.

Schließlich, wenn Sie in Xcode #keyPath eingeben, sagt die Autocomplete, dass es eine @objc property sequence erwartet.

enter image description here

Ausdrücke eingegeben #keyPath verwende, wird durch den Compiler (gut!) Überprüft werden, was jedoch die Abhängigkeit von Objective-C nicht entfernen.

Verwandte Themen