-3

给定一个数组

NSArray *myArray = @[@"hello", @5, @[@6, @7, @8]];
for (NSNumber *myNumber in myArray)
{
   NSLog (@"%@", myNumber);
}

日志消息的输出是 5 还是 5 6 7 8。即。for/in 循环是否内省字典/数组中的顶级对象或深入检查嵌套集、数组、字典等?

编辑

我意识到我为这个问题付出了很多热情,所以让我澄清一下我的意思。是的,你没问题,for-in 快速枚举不执行自省,但为什么不呢?如果我专门指定了一个类型,例如 NSNumber 或 NSString,为什么 for in 循环不使用您指定的类型执行 kindOfClass 方法,而不是将对象转换为不正确的类型?在上面的例子中,我只迭代数组中的 NSNumbers 是不是很直观?

我怀疑答案是对数组中的每个项目进行自省可能会否定快速枚举的性能增强?但是,当我们想要动态类型和显式类型时,当我们想要执行自省时,使用 id 不能解决这个问题吗?

4

1 回答 1

3

您的代码将生成:

 "hello"
 5
 (6, 7, 8)

一些评论...

1) for 循环仅枚举您正在枚举的任何对象的一个​​级别,因此它不会下降级别。

2) 你应该小心确保你的循环变量是正确的类型。并非您的每个元素NSArray都是NSNumber. 如果您尝试发送特定于 的消息NSNumber,您将收到运行时错误。

3)您的代码不会崩溃,因为使用%@with会向对象NSLog发送一条description消息,该消息由数组的所有元素实现。但是,在您的示例中,您仍然应该使用myNumbertype id,除非您 100% 确定数组中的所有内容实际上都是NSNumber.

于 2014-02-11T04:10:18.383 回答