Nur um das hinzuzufügen, denn ich hatte auch diesen Fehler. Beim Durchgehen all dieser Antworten scheinen die meisten sich auf die Arbeit mit der Benutzeroberfläche und Storyboard zu beziehen. Ich weiß, dass der ursprüngliche Poster anscheinend mit der Benutzeroberfläche gearbeitet hat, aber bei der Suche nach möglichen Gründen für diesen Fehler führen die meisten Fragen meist zurück zu dieser Frage, während die anderen als Duplikate geschlossen werden oder einfach Probleme mit der Verbindung von Elementen in einem Storyboard haben, deshalb werde ich meine Lösung hinzufügen.
Ich habe an einem Webdienst in Swift 2 gearbeitet. Ich hatte alle benötigten Proxy-Objekte und Stümpfe erstellt. Als ich durch das zurückgegebene XML ging, habe ich dynamisch Objekte instanziiert, die alle von NSObject
kamen und setValue:forKey
auf ihnen verwendet. Jedes Mal, wenn setValue:forKey
versuchte, eine Eigenschaft zu setzen, gab es diesen Fehler.
Ich hatte eine switch-Anweisung für jeden Typ, mit dem ich umging (zum Beispiel Bool?
, CShort?
, String?
) und für jeden XML-Knoten ging ich durch und überprüfte, was der Typ des Objekts war, dann konvertierte ich den Wert zu diesem Typ und versuchte, ihn mit setValue:forKey
zu setzen.
Schließlich begann ich, all diese setValue:forKey
-Zeilen auszukommentieren und stellte fest, dass mein default
-Fall der switch-Anweisung für String?
funktionierte.
Schließlich habe ich herausgefunden, dass man keine optionalen Swift-Typen mit setValue:forKey
verwenden kann, es sei denn, sie haben eine direkte Zuordnung zu einem Objective-C-Typ wie String?
oder NSNumber?
. Ich habe schließlich alle CShort?
-Typen in NSNumber?
geändert, da diese eine direkte Zuordnung haben. Für Bool?
war es in meinem Fall in Ordnung, einfach Bool
zu verwenden und es auf false
zu initialisieren. Andere haben vielleicht nicht dieses Glück.
Wie auch immer, welch ein Kopfschmerz das war, also hoffentlich hilft das jemand anderem, der ein ähnliches Problem hat und immer wieder zu dieser Frage umgeleitet wird und sich sagt: "Ich mache nichts in der Benutzeroberfläche!".
Zum Abschluss noch einmal zur Verdeutlichung, Key-Value Coding funktioniert nicht mit Optionals. Hier ist etwas, das ich irgendwo gefunden habe, aber ich weiß nicht mehr wo, also an die Person, die das gepostet hat, es tut mir leid und ich würde Kredit geben, wenn ich mich erinnern würde, wo ich das gefunden habe, aber es hat mir das Leben gerettet:
Sie können KVC nicht auf eine optionale Int-Eigenschaft anwenden, da KVC Cocoa/ Objective-C ist und Objective-C eine optionale Int nicht sehen kann - sie ist nicht mit Objective-C verbunden. Objective-C kann nur Typen sehen, die mit Objective-C verbunden sind:
Klassen, die von NSObject abgeleitet sind
Klassen, die mit @objc freigegeben sind
Swift-Strukturen, die verbunden sind