Objective c 为什么';通用NST字典是否会警告我键入错误的密钥插入/分配?
为什么以下Objective c 为什么';通用NST字典是否会警告我键入错误的密钥插入/分配?,objective-c,generics,Objective C,Generics,为什么以下NSDictionary/NSMutableDictionary调用不产生错误或警告 我希望在这里出现错误,因为rhsNSDictionaryliteral与NSDictionarylhs局部变量的泛型类型不匹配 NSDictionary<NSString *, NSNumber *> *foo = @{ @(42) : @"foo" }; 我在尝试分配类型不正确的值时看到一个错误,因此我知道泛型错误在某种程度上起作用: NSMutableDictionary<NS
NSDictionary
/NSMutableDictionary
调用不产生错误或警告
我希望在这里出现错误,因为rhsNSDictionary
literal与NSDictionary
lhs局部变量的泛型类型不匹配
NSDictionary<NSString *, NSNumber *> *foo = @{ @(42) : @"foo" };
我在尝试分配类型不正确的值时看到一个错误,因此我知道泛型错误在某种程度上起作用:
NSMutableDictionary<NSString *, NSNumber *> *foo = [NSMutableDictionary new];
foo[@"foo"] = @"bar";
为什么文字赋值或键入不正确的键不会导致警告/错误
这似乎是编译器的一个限制/缺陷,由
setObject:forkeydsubscript:
方法的定义引起:
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key;
上述代码的行为与NSMutableDictionary
相同。但是,如果我删除了KeyType
的
协议一致性限制,那么编译器会给出相应的警告:
@interface MyDictionary<KeyType, ObjectType>: NSObject
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType)key;
@end
...
MyDictionary<NSNumber*, NSNumber*>* dict = [[MyDictionary alloc] init];
dict[@"98"] = @14; // warning: Incompatible pointer types sending 'NSString *' to parameter of type 'NSNumber *'
@接口MyDictionary:NSObject
-(void)setObject:(可为null的ObjectType)obj forkeydsubscript:(KeyType)键;
@结束
...
MyDictionary*dict=[[MyDictionary alloc]init];
dict[@“98”]=@14;//警告:不兼容的指针类型正在将“NSString*”发送到“NSNumber*”类型的参数
注意。默认情况下,您会收到对象类型不匹配的警告,如果您想接收错误,您可以启用将所有警告视为错误生成设置,或者只启用将不兼容的指针类型警告视为错误一个
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key;
@interface MyDictionary<KeyType, ObjectType>: NSObject
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key;
@end
...
MyDictionary<NSNumber*, NSNumber*>* dict = [[MyDictionary alloc] init];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectZero];
dict[@"98"] = @14; // no warnings
dict[button] = @14; //warning: Sending 'UIButton *' to parameter of incompatible type 'id<NSCopying>'
@interface MyDictionary<KeyType, ObjectType>: NSObject
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType)key;
@end
...
MyDictionary<NSNumber*, NSNumber*>* dict = [[MyDictionary alloc] init];
dict[@"98"] = @14; // warning: Incompatible pointer types sending 'NSString *' to parameter of type 'NSNumber *'