19

valueForKeyPathで使用したいのですNSDictionaryが、問題は、キーの1つが@記号で始まる文字列であるということです。キーの名前を制御することはできません。

@記号をエスケープしようとしても、フォーマット例外が発生するため、キーパスを作成しようとすると問題が発生します。

これは正常に機能します。

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

ただし、これらはいずれも機能しません。

[dict valueForKeyPath:@"key1.@specialKey.key3"]
[dict valueForKeyPath:@"key1.@@specialKey.key3"]

何か案は?

ありがとう、

マイク

4

5 に答える 5

21

キー値コーディングを使用する場合は、キー名に@記号を使用しないでください。

キー名に関するアップルのガイドラインは次のとおりです。

キーはASCIIエンコーディングを使用する必要があり、小文字で始まり、空白を含めることはできません。

キーを取得する場所でキー文字列を再フォーマットしてKVCに準拠させるための回避策を見つける必要があります。

于 2009-10-14T18:33:11.520 に答える
13

この古い質問を少し更新するだけです...

これらの理由:

[dict valueForKeyPath:@"key1.@specialKey.key3"]
[dict valueForKeyPath:@"key1.@@specialKey.key3"]

...失敗とは、キーパス内の「@」記号が次のようにコレクションの演算子として解釈されることです。

[dict valueForKeyPath:@"key1.@sum.key3"] // returns the sum of all 'key3' values
[dict valueForKeyPath:@"key1.@avg.key3"] // returns the average of all 'key3' values

ネストされたキーは次を呼び出します。

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

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

于 2012-12-10T20:07:41.087 に答える
2

名前を制御できない場合は、奇妙なキーを返す/設定するだけの適切な名前のキーを持つカテゴリを追加してはどうでしょうか。

于 2009-10-14T21:29:59.523 に答える
0

2つの方法があることがわかります

スウィズル

をスウィズルしvalueForKeyPathNSDictionary@記号を削除できます。@sum、@ average、...を考慮することを忘れないでください。

Mantleを使用している場合はオーバーライドします

をオーバーライド+ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionaryMTLJSONAdapter、すべてのキーをトラバースして、@記号を削除します

于 2015-04-27T04:50:05.267 に答える
0

私の謙虚な意見では、ここでの議論全体が間違った方向に進んでいます。キーパスを介してNSDictionaryのエントリにアクセスすることは、KVCプロトコルの一部ではありません。

KVCは、KVCが機能できるように、オブジェクトのプロパティに名前を付ける方法を定義します。NSDictionaryのエントリはプロパティではなく、名前もありません。NSDictionaryは、エントリのキーが辞書の「プロパティ」のように「ふり」することで、KVCのような動作に少し魔法を加えます。

残念ながら、プロパティには辞書キーとは異なる命名規則と制限があります。

ディクショナリキーをKVCでサポートされているプロパティ名に強制的に準拠させることができない場合は、キーパスを解除し、疑わしい場合は代わりにアクセサを使用してください。

それが最も安全な方法だと思います。KVCは通常、コードを短縮できる「優れた」機能ですが、他の方法では(自分で示したように)他の方法では得られない機能を提供しません。

于 2020-09-17T12:05:57.200 に答える