2017-04-03 5 views
3

を失敗している:setValuesForKeysへの呼び出しが行われるとsetValueForKeysは、私が遊び場に次のコードを持っているスウィフト

class Pokemon : NSObject { 

    var name :String! 
    var id :Int? 
    var imageURL :String! 
    var latitude :Double! 
    var longitude :Double! 

    init(dictionary :[String:Any]) { 

     super.init() 
     setValuesForKeys(dictionary) 
} 
} 

let dict :[String:Any] = ["name":"John","imageURL":"someimageURL","latitude":45.67] 
let pokemon = Pokemon(dictionary: dict) 

それは次のように言って例外をスロー:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__lldb_expr_13.Pokemon 0x6000000ffd00> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key latitude.' 

私は鍵を持っています"緯度"しかし何らかの理由でそれを見つけることができません。何か案は!

SOLUTION:更新されたコード選択した答えを読み、ここにある:

class Pokemon : NSObject { 

    var name :String! 
    var id :Int = 0 
    var imageURL :String! 
    var latitude :Double = 0 
    var longitude :Double = 0 

    init(dictionary :[String:Any]) { 

     super.init() 
     setValuesForKeys(dictionary) 
} 
} 
+3

なぜこのようなイニシャライザを作成しますか?適切なイニシャライザを作成したり、プロパティを直接設定したりしないでください。 – rmaddy

+0

絶対に!しかし、私は上記のコードで私が間違っていることを見つけたい。また、多くのプロパティを設定している場合は、この初期化子が役立ちます。 –

+0

[this one](http://stackoverflow.com/q/26366082/3476191)はどうですか? – NobodyNada

答えて

5

をタイプDouble!(同様Double?が)そうit is not exposed as an Objective-C property、Objective-Cの世界では何の対応を持っていないので、キー値コーディングができません「緯度」という名前のキーを見つけてクラッシュします。

KVCが必要な場合は、これらのフィールドを非オプションに変換する必要があります。

class Pokemon : NSObject { 
    var name: String! 
    var id: Int = 0 
    var imageURL: String! 
    var latitude: Double = 0.0 
    var longitude: Double = 0.0 

    init(dictionary: [String: Any]) { 
     super.init() 
     setValuesForKeys(dictionary) 
    } 
} 
+0

そして文字列!またはストリング? Objective-Cの世界での対応があります。 –

+0

@johndoeはい、それらはObjCの 'NSMutableString *'になります。 – kennytm

関連する問題