我在一个NSMapTable 6项目的许多地方使用iOS,并且希望能够使用新的字典订阅样式来访问对象。(NSMapTable的行为主要类似于NSMutableDictionary,但可以为其存储的键和值配置各种内存管理选项。(更多关于this StackOverflow question的背景。)
当试图对NSMapTable实例使用订阅语法时,编译器会报告此情况:
读取“NSMapTable*”类型对象上找不到的字典元素的预期方法。
如何使用类别扩展NSMapTable以允许新的NSDictionary-style订阅?
发布于 2012-10-31 01:11:23
答案实际上很简单;有关如何实现订阅的更多信息,请参见this question。添加这样一个类别。
标题:
@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这让我一度怀疑,在某些情况下,下标访问是否真的比其他方法慢一点点,但“过早优化”一词使这种想法变得无关紧要。
发布于 2017-02-17 13:33:32
使用NSDictionary为nil键设置对象的行为改进的@mjh回答,并添加了Obj泛型:
@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];
}
@endhttps://stackoverflow.com/questions/13149740
复制相似问题