2017-07-18 4 views
1

Ich bin neu in Swift, und ich habe ein Problem mit Fehler diese Klasse ist nicht Schlüsselwert Codierung kompatibel für den Schlüssel.Swift - setValuesForKeys (Wörterbuch) Fehler - diese Klasse ist nicht Schlüsselcodierung-kompatibel für den Schlüssel

Ich habe alle verwandten Themen erneut gelesen und keine Lösung für dieses Problem gefunden.

Bitte überprüfen Sie den Code und geben Sie mir einen Rat, was habe ich falsch gemacht?

class FriendScore: NSObject { 
var name:String? 
var highestScore:Int? 
} 

var allScoresArr = [FriendScore]() 
var dataArr = [[String:Any]]() 

dataArr =[["name": "Ben", "highestScore": 15],["name": "Alex", "highestScore": 12]] 

for user in dataArray { 

if let dictionary = user as? [String:Any] { 
         let friendScore = FriendScore() 

         //Error Happens Here "Thread Breakpoint" 
         friendScore.setValuesForKeys(dictionary) 
         allScoresArr.append(friendScore) 
        } 
} 

print(allScoresArr) 

Der Fehler:

<__lldb_expr_73.FriendScore 0x608000266080> 
setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key highestScore. 

'libc++abi.dylib: terminating with uncaught exception of type NSException 
+2

Im Wesentlichen ein Duplikat von https://stackoverflow.com/questions/26366082/cannot-access-property-of-swift-type-from-objective-c: 'Int?' Ist nicht in Objective-C darstellbar. Machen Sie es zu einem "Int" oder "NSNumber"? –

+0

@Martin R Vielen Dank für die Hilfe! – Rurom

Antwort

2

Soweit ich das beurteilen kann, hat Ihr Beispiel eine Reihe von Fehlern. Zuerst definieren Sie var dataArr, dann definieren Sie let dataArr neu, dann iterieren Sie tatsächlich über dataArray.

Abgesehen davon ist Ihr dataArr eine Reihe von Wörterbüchern. Jedes Wörterbuch ist vom Typ [String: Any]. Wenn Sie setValuesForKeys(dictionary) aufrufen, versucht es, den Wert für name und highestScore zu den Werten in dem Wörterbuch festzulegen. Jeder dieser Werte ist vom Typ Any, aber die Klasse FriendScore erwartet einen Wert vom Typ String für name und einen Wert vom Typ Int für highestScore. Sie müssen jeden der Werte in den richtigen Typ werfen:

class FriendScore: NSObject { 
    var name:String? 
    var highestScore:Int? 
} 

let dataArr = [["name": "Ben", "highestScore": 15],["name": "Alex", "highestScore": 12]] 

for user in dataArr { 
    let friendScore = FriendScore() 
    friendScore.name = user["name"] as? String 
    friendScore.highestScore = user["highestScore"] as? Int 
} 

Wenn Ihre Klasse mehrere Parameter des gleichen Typs hatte man einfach setValuesForKeys verwenden könnte und ein Wörterbuch mit einem expliziten anderen Typ als Any passieren.

+0

"var dataArr, dann define let dataArr" - das ist nur ein Fehler im Beispiel, Tippfehler, ich misspell es leider. Das Hauptproblem war im Freundeskreis, Martin R hat mir schon geholfen. Aber trotzdem, @drootang Vielen Dank für die Analyse und für Ihre Ratschläge und Kommentare. Ich schätze es! – Rurom

Verwandte Themen