Objective-C如何保证NSMutableDictionary内元素遵守NSCopying协议
解决方案
- 你此前的属性声明写法存在错误:将
<NSCopying>放在指针尾部的写法,是要求字典实例本身遵守NSCopying协议,而非限制字典内部存储的元素类型,因此无法实现你需要的校验效果。 - 无需子类化NSDictionary,通过Objective-C轻量泛型语法即可实现编译期限制字典存储的value必须遵守NSCopying协议,正确的属性声明如下:
该声明中,泛型的第一个参数对应字典key的类型,第二个参数对应字典value的类型,这里将value限定为@property NSMutableDictionary<id, id<NSCopying>> *options;id<NSCopying>即任意遵守NSCopying协议的对象。后续你向该字典插入value时,编译器会自动做类型校验,插入未遵守NSCopying协议的对象时会抛出类型不匹配的编译错误。 - 上述限制仅作用于编译期,无法阻止运行时通过类型强转、runtime接口等非常规操作向字典插入不符合要求的对象,常规业务开发场景下该限制已足够覆盖需求。
- 补充
copyWithZone实现的注意点:由于你的属性是NSMutableDictionary可变类型,拷贝时不要直接调用copy方法(该方法返回不可变的NSDictionary实例,后续修改属性会触发崩溃),应调用mutableCopy方法拿到可变拷贝,示例写法:copiedInstance.options = [self.options mutableCopy];
内容的提问来源于stack exchange,提问作者Pat_Morita
相关产品推荐
相关产品推荐

