Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么';通用NST字典是否会警告我键入错误的密钥插入/分配?_Objective C_Generics - Fatal编程技术网

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
调用不产生错误或警告

我希望在这里出现错误,因为rhs
NSDictionary
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 *'