0

我对 Objective-c 很陌生,并试图更好地理解块。作为我自己的一项任务,我正在尝试以各种方法编写 fizz-buzz。

我目前正在使用块,但我遇到了一个我还没有解决的语法问题。

在下面的非工作函数中,我想传入一个 int 并返回一个 NSString 类型。

NSString (^whichMessage)(int) = ^(int num) {
    return @"Test";
};

但是我收到一条错误消息:

Incompatible block pointer types initializing 'NSString (^_strong)(int)' with an expression of type 'NSString *(^)(int)'

谁能解释我的示例代码有什么问题,以及正确的形式是什么?

我在这里关注文档:http: //developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1

(为了清楚起见,这里是链接页面上的示例代码)

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};

通过页面顶部的图形,我认为通过将块类型更改为 NSString 并将返回类型也更改为 NSString,它会起作用。但很可惜,事实并非如此。

4

3 回答 3

8

非常简单。您的块返回一个指向字符串的指针,而不是实际的字符串。我们总是使用指向对象的指针而不是实际的对象本身

         |
         v
NSString *(^whichMessage)(int) = ^(int num) {
    return @"Test";
};
于 2012-07-19T09:00:02.800 回答
3

你忘记了*:

NSString* (^whichMessage)(int) = ^(int num) {
    return @"Test";
};

Objective-C 只使用指针引用的基于堆的对象。您不能像在 C++ 中那样声明基于堆栈的 Objective-C 对象。

该规则的显着例外是块,它充当 Objective-C 对象并且可以基于堆栈。

于 2012-07-19T09:00:33.620 回答
1

你忘了一颗星*

NSString* (^whichMessage)(int) = ^(int num) {
    return @"Test";
};
于 2012-07-19T09:00:15.913 回答