给定数组
NSArray *myArray = @[@"hello", @5, @[@6, @7, @8]];
for (NSNumber *myNumber in myArray)
{
NSLog (@"%@", myNumber);
}
日志消息的输出是5还是5 6 7 8. ie。 for / in循环是否内省字典/数组中的顶级对象,还是深入检查嵌套集,数组,字典等。?
修改
我意识到我为这个问题付出了很多热情,所以让我澄清一下我的目标。是的你没事,for-in快速枚举不执行内省,但为什么不呢?如果我专门指定一个类型,如NSNumber或NSString,为什么for循环不会使用您指定的类型执行kindOfClass方法,而不是将对象转换为不正确的类型?在上面的例子中,我是否只是迭代数组中的NSNumbers是不是很直观?
我怀疑答案是对数组中的每个项目进行内省可能会否定快速枚举的性能增强?但是当我们想要进行内省时,当我们想要动态类型和显式类型时,使用id是不是可以解决这个问题?
答案 0 :(得分:3)
您的代码将生成:
"hello"
5
(6, 7, 8)
一些评论......
1)for循环只枚举你要枚举的任何对象的一个级别,因此它不会降低级别。
2)您应该小心确保您的循环变量是正确的类型。并非NSArray
的每个元素都是NSNumber
。如果您尝试发送特定于NSNumber
的邮件,则会收到运行时错误。
3)您的代码不会崩溃,因为%@
使用NSLog
向对象发送description
消息,该消息由数组的所有元素实现。在您的示例中,您仍然应该myNumber
类型为id
,除非您100%确定数组中的所有内容实际上都是NSNumber
。