2009-10-14 1 views
18

NSDictionaryvalueForKeyPathを使用しますが、問題は、キーの1つが@記号で始まる文字列であることです。私はキーの命名を制御できません。キーが@記号を開始する場合、NSDictionaryのvalueForKeyPathを使用しますか?

私は@記号を脱出しようとしても、フォーマット例外を取得していますように、キーパスを作成しようとしている問題を抱えている:

これは正常に動作します:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"] 

これらの作業のしかしどれも:

[dict valueForKeyPath:@"[email protected]"] 
[dict valueForKeyPath:@"[email protected]@specialKey.key3"] 

任意のアイデア?

おかげで、あなたは、キー値コーディングを使用したい場合は、あなたのキー名を持つ兆候@使用すべきではない

マイク

+0

を削除するので、基本的にあなたの辞書のobjectForKey:「キー1」@はあまりにNSDictionaryObjectです。そしてそのdict objectForKey:@ "key3" –

答えて

19

キーが小文字で を開始し、ASCIIエンコーディングを使用しなければならない、と は空白文字を含めることはできません。次のようにキー名の

apple's guidelinesです。

キーをKVCに準拠させるためには、キーストリングを再フォーマットする必要があります。

+0

ああ大丈夫です!私はエスケープの何らかの形が起こる必要があると思ったが、それについて考えている、もちろん@で始まるものはKVCに準拠することはできない!乾杯! –

+1

np。コアデータのようなKVCを使用する他のクラスやテクノロジーを使用すると、頭痛の種になることもありません。 – pxl

1

ネーミングを制御できない場合は、奇妙なキーを返す/設定する適切な名前のキーを持つカテゴリを追加する方法はありますか?これらのことを

+0

これは良い考えです。 KVCが何をすべきかを考えれば、私はそれがどのように必要なのかわかりません。 KVCは、プロパティにアクセスできるように名前をつけるゲッターとセッターを一貫して作成するための習慣です。そのため、@記号付きのプロパティに名前を付けることができない場合、キーパスの一部である状況には絶対に入るべきではありません。 – pxl

13

ただ、この古い質問を更新するために少し...

理由:

[dict valueForKeyPath:@"[email protected]"] 
[dict valueForKeyPath:@"[email protected]@specialKey.key3"] 

が...失敗は、キーパスのいずれかの「@」記号があるものとして解釈されるということです

[dict valueForKeyPath:@"[email protected]"] // returns the sum of all 'key3' values 
[dict valueForKeyPath:@"[email protected]"] // returns the average of all 'key3' values 

ネストされたキーのコール:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"] 
のように

...単一のキーがキーパスとして処理されないために機能します。

+0

ありがとう!出来た!!! –

0

私は、あなたが、@記号を削除@sumを説明するために覚えて、@averageするNSDictionaryvalueForKeyPathをスウィズルすることができます

スウィズル 2通り

があることがわかり...

オーバーライドあなたがMTLJSONAdapterにマントル

オーバーライド+ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionaryを使用している場合、すべてのキーを横断し、@記号

関連する問題