4

我以为我知道如何使用快速枚举,但有一些我不明白的地方。如果我创建三个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

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

4

8 回答 8

10

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

如果您只想要 NSStrings,则需要编写如下内容:

for (id obj in array) {
    if ([obj isKindOfClass:[NSString class]]) {
        NSLog(@"str: %@", obj);
    }
}
于 2011-08-02T21:13:09.003 回答
8

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

于 2011-08-02T21:10:42.190 回答
7

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

for(NSString *str in array)
{
    if([str isKindOfClass:[NSString class]])
        NSLog(@"str : %@", str);
}
于 2011-08-02T21:12:51.897 回答
1
for (NSString *str in array) {

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

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

看一下The Objective-C Programming Language guide 中的Fast Enumeration

于 2011-08-02T21:10:53.017 回答
1

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

于 2011-08-02T21:18:40.447 回答
1

每个从 NSObject 派生的对象都实现方法 - (NSString)description,Objective-C 格式字符串中的 %@ 将获取 %@ 的相应参数并调用其描述方法,大多数 NSObject 子类将实现自己的 - ( NSString) 描述。键入时会发生同样的事情

> po anObject

在调试器中。

于 2011-08-03T07:13:58.720 回答
0

我不明白意外行为在哪里,在 an 中使用增强的 for 循环NSMutableArray只会遍历数组中的每个对象,在你的情况下是 6,结果是正确的和预期的。

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

于 2011-08-02T21:10:42.520 回答
0

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

于 2013-02-05T08:27:03.810 回答