不同类型NSArray的快速计数

Mik*_*e D 5 objective-c fast-enumeration

我在这里有这个问题(以及关于SO的其他问题),以及有关Objective-C集合和快速枚举的Apple文档.不清楚的是,如果NSArray填充了不同类型,并创建了一个循环,如:

for ( NSString *string in myArray )
    NSLog( @"%@\n", string );
Run Code Online (Sandbox Code Playgroud)

这到底发生了什么?循环会跳过任何不是的东西NSString吗?例如,如果(为了参数)a UIView在数组中,当循环遇到该项时会发生什么?

joh*_*ohn 9

你为什么想这么做?我认为这会导致错误和无意识的行为.如果您的数组填充了不同的元素,请改用:

for (id object in myArray) {
    // Check what kind of class it is
    if ([object isKindOfClass:[UIView class]]) {
       // Do something
    }
    else {
       // Handle accordingly
    }
}
Run Code Online (Sandbox Code Playgroud)

你在你的例子中所做的实际上与

for (id object in myArray) {
    NSString *string = (NSString *)object;
    NSLog(@"%@\n", string);
}
Run Code Online (Sandbox Code Playgroud)

仅仅因为你投object(NSString *),并不意味着string实际上会指向一个NSString对象.调用NSLog()以这种方式将调用- (NSString *)description根据该方法NSObject的协议,其被类的数组内引用的可能或可能不符合.如果它符合,它将打印出来.否则,它会崩溃.