为什么在指定NSStrings时快速枚举不会跳过NSNumbers?

时间:2011-08-02 21:06:32

标签: objective-c nsarray fast-enumeration

我认为我知道如何使用快速枚举,但有一些我不明白的事情。如果我创建了三个NSString个对象和三个NSNumber个对象,并将它们放在NSMutableArray中:

NSString *str1 = @"str1";
NSString *str2 = @"str2";
NSString *str3 = @"str3";

NSNumber *nb1 = [NSNumber numberWithInt:1];
NSNumber *nb2 = [NSNumber numberWithInt:2];
NSNumber *nb3 = [NSNumber numberWithInt:3];

NSArray *array = [[NSArray alloc] initWithObjects:str1, str2, str3, nb1, nb2, nb3, nil];

然后我对所有NSString个对象进行快速枚举,如下所示:

for (NSString *str in array) {
    NSLog(@"str : %@", str);
}

在控制台中,我得到了这个结果:

2011-08-02 13:53:12.873 FastEnumeration[14172:b603] str : str1
2011-08-02 13:53:12.874 FastEnumeration[14172:b603] str : str2
2011-08-02 13:53:12.875 FastEnumeration[14172:b603] str : str3
2011-08-02 13:53:12.875 FastEnumeration[14172:b603] str : 1
2011-08-02 13:53:12.876 FastEnumeration[14172:b603] str : 2
2011-08-02 13:53:12.876 FastEnumeration[14172:b603] str : 3

我只记录了NSString,但我得到了数组中每个对象的一行,甚至是NSNumber,我不明白为什么。快速枚举是否始终使用数组中包含的每个对象?

8 个答案:

答案 0 :(得分:10)

当你编写像这样的forin循环时,它会将数组中的每个对象强制转换为NSString,然后按要求将它们打印出来。

如果你只想要NSStrings,你需要写这样的东西:

for (id obj in array) {
    if ([obj isKindOfClass:[NSString class]]) {
        NSLog(@"str: %@", obj);
    }
}

答案 1 :(得分:8)

for all循环不知道NSStrings和Integers之间的区别 - 它只是遍历整个数组,将每个数组转换为NSString,并按照你的要求打印出来。

答案 2 :(得分:7)

我很确定快速枚举会返回数组中的所有对象 - 您在for (NSString *str in array)中所做的一切都是strNSString的类型转换。在循环体中,您需要检查返回对象的类,以确保它是NSString

for(NSString *str in array)
{
    if([str isKindOfClass:[NSString class]])
        NSLog(@"str : %@", str);
}

答案 3 :(得分:1)

for (NSString *str in array) {

是一种枚举数组中所有元素的方法。

您期望通过指定NSString,您只获得该类型的对象是不正确的。相反,所有对象指针都转换为该类型(NSString*)。

在Objective-C编程语言指南中查看Fast Enumeration

答案 4 :(得分:1)

Objective-C是动态类型的,这意味着在运行时(当循环实际运行时),对象实际上都是具有不同类的一种类型(id)。该语言允许可选的编译时静态类型,但所做的只是检查您发送的消息是否对您标记的类型有效。它实际上并没有改变程序的行为。如果你将一个对象转换为一个与它实际不同的类型,那么你所做的就是向编译器撒谎并击败它的类型检查器。

答案 5 :(得分:1)

来自NSObject的每个对象实现方法 - (NSString)描述,Objective-C格式字符串中的%@将为%@取相应的参数并调用其描述方法,NSObject的大多数子类将实现自己的版本 - (NSString)描述。键入

时会发生同样的事情
> po anObject

在调试器中。

答案 6 :(得分:0)

我不明白意外行为在哪里,在NSMutableArray中使用增强的for循环将只通过数组中的每个单个对象进行迭代,在您的情况下为6,结果是正确的和预期的。

这些数字只会转换为字符串。

答案 7 :(得分:0)

在快速枚举中没有类型转换,只需将指针分配到新对象