目标C的HOM

时间:2010-04-12 14:22:21

标签: objective-c

我是Objective-C的新手,但我尝试使用HOM(higher order message)来迭代NSArray并在每个元素后附加一个字符串。

这是我的代码:

void print( NSArray *array ) {
    NSEnumerator *enumerator = [array objectEnumerator];
    id obj;

    while ( nil!=(obj = [enumerator nextObject]) ) {
        printf( "%s\n", [[obj description] cString] );
    }
}


int main( int argc, const char *argv[] ) {
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

 NSArray *names = [[NSArray alloc] init];
 NSArray *names_concat = [[NSArray alloc] init];
 names = [NSArray arrayWithObjects:@"John",@"Mary",@"Bob",nil];
 names_concat = [[names collect] stringByAppendingString: @" Doe"];

 print(names_concat);
 [pool release];
}

此代码有什么问题?

我的编译器(gcc)说NSArray可能不响应“-collect”

1 个答案:

答案 0 :(得分:1)

因为方法-collect不是标准Objective-C库的一部分!

您需要获得一些库并将其添加到您的项目中。见an article at CocoaDev。对于collect,请参阅此blog article

从10.6开始,Apple向NSArray添加了一些接受块(或者换句话说是闭包)的方法。请参阅NSArray documentation并查找字词block

顺便说一句,在一个相当不相关的点上,请不要使用方法 cString。这已被弃用!见NSString documentation。关于字符的编码,cString非常糟糕。我知道你只是用它来进行调试,但是我不希望你养成使用弃用方法的习惯,尤其是关于编码的方法。

OS X通常是一个对许多编码非常友好的操作系统,但作为一个东亚人,我看到许多伟大的程序表现得很糟糕只是因为程序员使用cString等等...只要你使用非 - 已经过时的方法。很抱歉发表不相关的评论:p