【问题标题】:Implement case insensitive NSMutableDictionary实现不区分大小写的 NSMutableDictionary
【发布时间】:2020-07-23 15:37:52
【问题描述】:

我尝试从NSMutableDictionary<NSString *,NSString *> 继承,以便使用不区分大小写的键实现字典。这是我的实现:

@interface NSMutableDictionaryLowerCase : NSMutableDictionary<NSString*, NSString *>
@end

@implementation NSMutableDictionaryLowerCase
    
-(NSString *)objectForKey:(NSString *)aKey {
    return [[super objectForKey:aKey] lowercaseString];
}

@end
NSMutableDictionaryLowerCase * x = [NSMutableDictionaryLowerCase new];
    
[x setValue:@"XxX" forKey:@"YyY"];

NSLog(@" %@ %@ ", x[@"xxx"], x[@"XXX"]) 

但是,当它与以下代码一起使用时,它会在 setValue 上捕获异常并显示以下消息:

[NSMutableDictionary setObject:forKey:]: method only defined for abstract class. Define -[NSMutableDictionaryLowerCase setObject:forKey:]!'

我不明白,NSMutableDictionary 不应该是抽象类,我以为这个方法实现已经存在了......我做错了什么?

【问题讨论】:

    标签: objective-c oop inheritance


    【解决方案1】:

    来自NSMutableDictionary的文档:

    子类化注释

    通常应该很少需要子类化NSMutableDictionary。如果您确实需要自定义行为,通常最好考虑组合而不是子类化。

    重写方法

    在子类中,您必须重写它的两个原始方法:

    • setObject(_:forKey:)
    • removeObject(forKey:)

    您还必须覆盖NSDictionary 类的原始方法。

    【讨论】:

      【解决方案2】:

      感谢@Larme,这是修复:

      @interface NSMutableDictionaryLowerCase : NSMutableDictionary<NSString*, NSString *> {
          NSMutableDictionary* _proxy;
      }
      @end
      
      @implementation NSMutableDictionaryLowerCase
      
      - (instancetype)init {
          if (self = [super init]) {
              _proxy = [[NSMutableDictionary alloc] init];
          }
          return self;
      }
      
      -(NSString *)objectForKey:(NSString *)aKey {
          return [_proxy objectForKey:[aKey lowercaseString]];
      }
      
      -(void)setObject:(NSString *)anObject forKey:(NSString *)aKey{
          [_proxy setObject:anObject forKey:[aKey lowercaseString]];
      }
      
      @end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-01
        • 2013-03-06
        • 2020-02-18
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        相关资源
        最近更新 更多