2009-10-14 46 views
18

我想在我的NSDictionary上使用valueForKeyPath,但問題在於其中一個鍵是以@符號開頭的字符串。我無法控制密鑰的命名。如果一個鍵啓動@符號,在NSDictionary上使用valueForKeyPath?

我在試圖逃跑@符號問題時試圖建立的關鍵路徑,因爲我得到一個格式異常,甚至:

這工作得很好:

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

但是這些都不工作:

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

任何想法?

感謝,

邁克

+0

所以基本上你的字典objectForKey:@「KEY1」是NSDictionaryObject了。而那個字典objectForKey:@「key3」 – 2012-10-03 10:58:05

回答

19

,如果你想使用鍵值編碼,你不應該使用@你的鍵名的跡象。

apple's guidelines關鍵名稱如下:

鍵必須使用ASCII編碼,開始 以小寫字母,不得 包含空格。

您必須找到解決方法來重新格式化密鑰字符串,無論您將密鑰從KVC兼容。

+0

啊,那好吧!我認爲某種形式的轉義需要發生,但是想到它,當然,以@開頭的東西不能與KVC兼容!乾杯! – 2009-10-14 18:37:25

+1

np。當您使用其他使用KVC的類和技術(如核心數據)時,它也會爲您節省很多頭痛的問題。 – pxl 2009-10-14 18:41:14

1

如果您無法控制命名,那麼如何使用正確命名的密鑰添加一個類別來簡單地返回/設置奇怪的密鑰?

+0

這是一個好主意。但考慮到KVC應該做什麼,我不明白這是甚至是必要的。 KVC是一種慣例,可以一致地命名getter和setter,以便您可以訪問屬性。所以如果你不能用一個@符號來命名一個屬性,那麼你應該永遠不會陷入它也是一個關鍵路徑的一部分。 – pxl 2009-10-14 21:33:05

13

只是爲了更新這個老問題有點......

的原因,這些:

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

...失敗是在關鍵路徑上的任何「@」符號解釋爲collection's operators如:

[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

謝謝!有效!!! – 2016-05-30 09:11:15

0

我看到有2種方式

調酒

可以調配的valueForKeyPathNSDictionary刪除@符號,記住要佔@sum,@average,...

覆蓋,如果你在使用MTLJSONAdapter地幔

覆蓋+ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary,遍歷所有鍵和刪除@符號

相關問題