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.
Ich weiß, es fühlt sich an wie rückwärts gehen. Jede Observable muss von NSObject erben. –
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
@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