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

gre*_*bzh 4 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];
Run Code Online (Sandbox Code Playgroud)

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

for (NSString *str in array) {
    NSLog(@"str : %@", str);
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我只记录了NSStrings,但我得到了数组中每个对象的一行,即使是NSNumbers,我也不明白为什么.快速枚举是否始终使用数组中包含的每个对象?

Kat*_*ish 10

当你编写像这样的forin循环时,它会将数组中的每个对象转换为NSString,然后根据请求将它们打印出来.

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

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


Chr*_*egg 8

for all循环不知道NSString的和整数之间的区别-它仅仅经过整个阵列,每个投作为一个NSString,并打印出来,你问.


Car*_*ter 7

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

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