Objective c 回路中的类型安全

Objective c 回路中的类型安全,objective-c,xcode7,Objective C,Xcode7,我已经在objective 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

我已经在objective 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
NSMutableArray*x=[NSMutableArray new];
[x addObject:@14];
[x addObject:@“s”];// 问题就在这里

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


快速枚举来自
NSFastEnumeration
协议及其
countbyEnumerating with state:objects:count:
方法。不幸的是,
objects
参数是
id
的C数组。它不使用
ObjectType
。由于对象是类型
id
,编译器不能像对
NSArray
的其他方法那样进行任何类型检查,这是一个错误。NSFastEnumeration之类的实现细节并不重要。如果他们没有发出警告,他们至少应该在分析仪通道中进行检查。请在Apple和LLVM上提交错误报告

Obj-C不实现泛型。不是真的。它拥有的仿制药是为了迅速提供支持。这并不意味着它们将在Obj-C代码中强制执行。也许在将来,但不幸的是,这将涉及兼容性问题,所以我认为这是不可能的。如果给负号的人能解释一下,那就太好了!我真想探讨一下这个问题。所以,如果我不清楚或者只是愚蠢,就告诉我可能只是编译器中的一个疏忽。@Kenthomass不确定这只是一个疏忽。for in-loop工作的方法是通过NSFastEnumeration协议,该方法返回一个NSInteger(如果我错了,请纠正我)。可能是因为正在工作的方式,无法获得编译器警告。@sbarow否,但现在就可以了