2017-06-26 3 views
16

Ich habe eine Swift-Bibliothek, die stark auf obj.valueForKey() von NSObject angewiesen ist.Swift 4 "Diese Klasse ist nicht Schlüsselcodierung kompatibel"

Nach der Migration zu Swift 4 habe ich festgestellt, dass diese Aufrufe immer mit dem Fehler "Diese Klasse ist nicht Schlüsselcodierung-kompatibel für den Schlüssel ..." abstürzen, wenn die Eigenschaft, die ich suche, mit @objc deklariert ist .

Ist es jetzt obligatorisch, Eigenschaften mit @objc zu deklarieren, damit sie mit dieser Methode gefunden werden können? Gibt es eine Alternative?

+6

Vergleichen [Wie kann ich mit @objc Inferenz Deprecation mit #selector() in Swift 4 umgehen?] (Https://stackoverflow.com/q/44390378/2976878) – Hamish

Antwort

36

Wenn Sie die Migration durchgeführt Xcode gefragt, über @objc Inferenz und Sie wahrscheinlich den neuen Typ anstelle von Swift3 ausgewählt.

Mögliche Lösungen:

Verwenden @objc

Verwenden @objc für jedes Verfahren, wie anstelle der ganzen Klasse benötigt.

Verwenden @objcMembers

Sie nur @objcMembers auf die Klasse verwenden könnten.

Durch das Anwenden des @objcMembers-Attributs auf eine Klasse wird das @objc-Attribut implizit allen Objective-C-kompatiblen Elementen hinzugefügt.

Writing Swift Classes and Protocols with Objective-C Behavior

Beachten Sie: weil das @objc Attribut Anwendung kann die kompilierte Größe einer App erhöhen und sich negativ auf die Leistung auswirken, gelten nur die @objcMembers auf Attributdeklarationen, wenn jedes Mitglied haben muss das @objc-Attribut wurde angewendet.

Schalter Schluß auf das alte Verhalten

Sie können auch das Verhalten des Projekts ändern unter: Build Settings>Swift 3 @objc Inference>On/Off

Verwandte Fragen:

+2

Beste Antwort aller Zeiten. Ich hatte das gleiche Problem beim Aufruf von .value (forKey :) auf meinem Objekt, obwohl es NSCoding Schlüssel konform sein sollte Danke! – Mallox

+0

Danke, danke, danke. @objcMembers arbeitet für mich. –

Verwandte Themen