NSDictionary的大小写不敏感键

6

我正在尝试在NSDictionary的JSON响应中使用不区分大小写的情况,因为有时我的响应键类型会有所变化,有些是驼峰式,有些是小写或其他混合组合。是否有任何内置功能可以检查这种情况下的不敏感案例?

谢谢。


4
你考虑过在将键添加到字典之前将其全部转换为小写吗?那么每当你查找一个键时,只需将其转换为小写即可。 - Matt
有什么想法怎么做吗? - topgun
4个回答

6

1
我喜欢你使用映射字典来保留键的大小写, 并且保持搜索算法的 log(n) 复杂度。大多数解决方案会放弃其中一个。 - Peter

5

最好的方法是将NSDictionary的键设置为全部小写或全部大写;

例如,假设我有一个字符串的NSArray。在使用它之前,我可以获取keyName并使用lowercaseString或uppercaseString进行转换。

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

这将把字符串更改为姓氏,如果我使用了uppercaseString,它将变成LASTNAME。

或者您也可以在添加到字典时更改键名,如下所示:

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

3
- (NSString *)lowercaseString

这是NSString的默认方法,只需在添加到NSMutableDictionary时执行[key lowercaseString],或者从中读取时执行即可。


虽然这里所有的答案都是正确的,但是我不得不一直使用这个概念来反序列化我的数据并插入小写的键,现在一切都像魔法般地运行。谢谢大家。 - topgun
1
为了方便起见,您可以编写一个 CaseInsensitive[Mutable]Dictionary 子类,它是 NS[Mutable]Dictionary 的子类。您将覆盖每个以键作为参数的方法,并使用 [key lowercaseString] 调用超级方法。现在您的客户端代码仍然保持完美可读性:它只需要使用 CaseInsensitiveMutableDictionary 而不是 NSMutableDictionary - Timo

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接