我对Objective-c很新,并试图更好地理解块。作为我自己的一项任务,我正试图用各种方法写出嘶嘶声。
我目前正在使用块,但是我遇到了一个我还没有解决的语法问题。
在下面的非工作函数中,我想传入一个int并返回一个NSString类型。
NSString (^whichMessage)(int) = ^(int num) {
return @"Test";
};
但是我收到错误声明:
Incompatible block pointer types initializing 'NSString (^_strong)(int)' with an expression of type 'NSString *(^)(int)'
任何人都可以解释我的示例代码的问题是什么,以及正确的形式是什么?
(为了清楚起见,这是链接页面上的示例代码)
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
通过页面顶部的图形,我认为通过将块类型更改为NSString并将返回类型更改为NSString,它可以正常工作。但是,唉,它没有。
答案 0 :(得分:8)
非常简单。您的块返回指向字符串而不是实际字符串的指针。我们总是使用指向对象的指针而不是实际的对象本身
|
v
NSString *(^whichMessage)(int) = ^(int num) {
return @"Test";
};
答案 1 :(得分:3)
你忘记了*:
NSString* (^whichMessage)(int) = ^(int num) {
return @"Test";
};
Objective-C仅使用指针引用的基于堆的对象。您不能像在C ++中那样声明基于堆栈的Objective-C对象。
该规则的值得注意的例外是块,它们充当Objective-C对象并且可以基于堆栈。
答案 2 :(得分:1)
您忘了明星*
:
NSString* (^whichMessage)(int) = ^(int num) {
return @"Test";
};