objective-c – 为in循环键入安全性

我已经在目标c中尝试了类型安全一段时间了.我想我得到了一些,但我想知道以下是否可行.

NSMutableArray <NSNumber *> *x = [NSMutableArray new];
[x addObject:@14];
[x addObject:@"s"]; // <--- Gives warning, good!

for (NSUInteger i = 0; i < x.count; i++) {
    NSString *s = [x objectAtIndex:i]; // <-- Gives warning, good!
}

NSString *d = x[0]; // <-- Gives warning, good!


//but
for (NSString *s in x) // <-- expected warning but didn't get it
    NSLog(@"%@", [s stringByAppendingString:@"s"]; // <-- no warning just run time error

所以我的问题是,当使用不正确的对象时,for循环可以发出警告.我想使用for,因为它很快并且隐藏了实现的细节.

最佳答案 这是问题所在.

大多数NSArray / NSMutableArray方法(如addObject:和objectAtIndexedSubscript :(允许使用现代[index]语法)获取或返回ObjectType值. ObjectType是一个特殊指示符,表示为数组指定的“使用泛型类型”.

快速枚举来自NSFastEnumeration协议及其countByEnumeratingWithState:objects:count:方法.不幸的是,objects参数是一个id的C数组.它不使用ObjectType.由于对象是类型id,因此编译器不能像NSArray的其他方法那样进行任何类型检查.

点赞