2012-05-24 162 views
6

我想在NSDictionary上使用大小寫敏感的JSON響應的情況,因爲有時候我的響應鍵類型有所不同,有些是駱駝大小寫,有些是小寫字母或其他混合組合。有沒有內置的功能來檢查這種情況下的非敏感情況?NSDictionary的大小寫不敏感的鍵

謝謝。

+4

你有沒有考慮剛轉換的關鍵全部小寫,然後將其添加到字典中?然後,無論何時查找密鑰,只需將其轉換即可。 – Matt

+0

任何想法如何做到這一點? – kforkarim

回答

6

最近我共享,可能滿足您的需求兩大類。它們提供不區分大小寫的操作(以NSDictionaryNSMutableDictionary方法命名),同時保留最初插入的密鑰。

試試看:

https://github.com/keeshux/ios-components/tree/master/Components/Utils/KSCIDictionary

+1

我喜歡你使用映射字典來保存密鑰的大小寫,並保留搜索算法的「log(n)」複雜度。大多數解決方案都放棄了其中的一種。 – Peter

3
- (NSString *)lowercaseString 

這是一個默認的NSString方法,只是在添加或讀取NSMutableDictionary時執行[key lowercaseString]。

+0

雖然在這裏所有的答案都是正確的,但是在反序列化我的數據並插入鍵時,我必須一直使用這個概念,以小寫形式,現在一切都像魅力一樣。謝謝大家 – kforkarim

+1

爲了方便起見,你可以寫一個'NS [Mutable] Dictionary'的CaseInsensitive [Mutable] Dictionary'子類。您可以重寫每個將鍵作爲參數的方法,並使用'[key lowercaseString]'調用超級方法。現在你的客戶端代碼仍然是完全可讀的:它只需要使用'CaseInsensitiveMutableDictionary'而不是'NSMutableDictionary'。 – Timo

5

最好的辦法是將NSDictionary的關鍵字設置爲全部小寫或全部大寫;

例如讓我說我有一個NSArray的字符串。我能得到的鍵名之前,我使用它,並通過使用lowercaseString或uppercaseString

NSString *itemName = @"lastName"; 
itemName = [itemName lowercaseString]; 

將它轉換,這將改變姓氏的字符串,或者如果我用uppercaseString這將是LASTNAME

,或者你也可以像這樣添加到字典時更改鍵名:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
[dict setObject:objectToAdd forKey:[key uppercaseString]]; 
0

在我而言,我並不需要所有的字典方法或屬性。我只需要不區分大小寫的下標訪問。我做了一個自定義類(的NSMutableDictionary的超類)和實現的方法,讓下標訪問,並做那些不區分大小寫:

- (id) objectForKeyedSubscript: (NSString *) key { 
    NSMutableDictionary *theData = self->data; 
    return theData[[key lowercaseString]]; 
} 

- (void) setObject: (id) newValue forKeyedSubscript: (NSString *) key { 
    NSMutableDictionary *theData = self->data; 
    theData[[key lowercaseString]] = newValue; 
} 

參見: http://clang.llvm.org/docs/ObjectiveCLiterals.html