NSDictionary不区分大小写的objectForKey:

NNi*_*ikN 8 objective-c nsdictionary case-insensitive key-value ios

NSDictionary有objectForKey,但它是密钥的大小写.有没有提供类似的功能

- (id)objectForKey:(id)aKey options:(id) options;
Run Code Online (Sandbox Code Playgroud)

您可以在选项中传递"NSCaseInsensitiveSearch"

要从NSDictionary中获取密钥,这是一个案例不可能,可以使用下面编写的代码.

Sid*_*diq 12

您需要使用此功能添加NSDictionary类的类别

- (id)objectForCaseInsensitiveKey:(NSString *)key {
    NSArray *allKeys = [self allKeys];
    for (NSString *str in allKeys) {
        if ([key caseInsensitiveCompare:str] == NSOrderedSame) {
            return [self objectForKey:str];
        }
    }
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

  • ...而你刚刚将搜索复杂性从"O(log(N))"变为"O(N)" (8认同)

Chu*_*uck 9

由于以下几个原因,不包括此内容:

  1. NSDictionary使用哈希等式,对于几乎任何好的哈希算法,源字符串中的任何变化都会产生不同的哈希值.

  2. 更重要的是,NSDictionary键不是字符串.符合NSCopying的任何对象都可以是字典键,并且包含的​​字符串多于字符串.NSNumber与NSBezierPath的不区分大小写的比较是什么样的?

这里的许多答案提供的解决方案相当于将字典转换为数组并迭代它.这是有效的,如果你只需要一次性,这很好.但是这种解决方案有点难看并且具有糟糕的性能特征.如果这是我的东西需要大量的(比如说,足以创造一个NSDictionary类),我希望妥善解决这个问题,在数据结构层次.

你想要的是一个包装NSDictionary的类,它只允许键的字符串,并在给出键时自动降低键(如果你需要双向映射,也可能记住原始键).这实现起来相当简单,设计更加简洁.这对于一次性来说太沉重了,但是如果这是你做了很多事情,我认为值得干净利落.