5

NSMapTable在 iOS 6 项目的许多地方使用,并且希望能够使用新的字典下标样式来访问对象。(NSMapTable行为大多类似于NSMutableDictionary,但可以为其存储的键和值配置各种内存管理选项。此 StackOverflow 问题的更多背景信息。)

NSMapTable尝试在实例上使用下标语法时,编译器会报告此问题:

在“NSMapTable *”类型的对象上找不到读取字典元素的预期方法。

如何使用类别进行扩展NSMapTable以允许新式NSDictionary下标?

4

2 回答 2

4

答案其实很简单;有关如何实现下标的更多信息,请参阅此问题。添加这样的类别。

标题:

@interface NSMapTable (Subscripting)

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
- (id)objectForKeyedSubscript:(id)key;

@end

执行:

@implementation NSMapTable (Subscripting)

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key {
    [self setObject:obj forKey:key];
}

- (id)objectForKeyedSubscript:(id)key {
    return [self objectForKey:key];
}

@end

这让我想知道,在某些或所有情况下,下标访问实际上是否比替代方法慢一点,但是“过早优化”一词使这种想法变得无关紧要。

于 2012-10-31T01:11:23.017 回答
2

改进了@mjh 的答案,其中包含NSDictionary为键设置对象的行为nil并添加了 Obj-C 泛型:

@interface NSMapTable<KeyType, ObjectType> (Subscripting)

- (void)setObject:(ObjectType)obj forKeyedSubscript:(KeyType)key;
- (ObjectType)objectForKeyedSubscript:(KeyType)key;

@end

@implementation NSMapTable (Subscripting)

- (void)setObject:(id)obj forKeyedSubscript:(id)key {
    if (object) {
        [self setObject:obj forKey:key];
    } else {
        [self removeObjectForKey:key];
    }
}

- (id)objectForKeyedSubscript:(id)key {
    return [self objectForKey:key];
}

@end
于 2017-02-17T13:33:32.813 回答