简体   繁体   中英

incompatible blocks type assigning

I have used blocks a few times but never with declaring a typedef first.

I am trying to setup this definitions on a class (lets call it ClassA)

typedef void (^myBlock)();

@property (nonatomic, copy) myBlock onCompletion;

Then I create an instance of the object this class represents and do this:

ClassA *obj = [[ClassA alloc] init];
obj.onCompletion = ^(){
   // my code here
};

it is complaining "incompatible block pointer types assigning"...

can you guys explain?

尽管不必指定块的返回类型,但是如果块不带任何参数,则必须指定 void

Check out this link for block reference: block syntax

Just guessing it might be because you left the block parameter type blank.

typedef void (^myBlock)(void); //Untested

The only difference in the declared block type myBlock and the type of the block literal might be the return type.

If you leave the return type out in a block literal the compiler figures it out automatically:

myBlock block1 = ^() { // everything is fine
   return;
};

myBlock block2 = ^() { // does not work, types differ
   return 1;
};

At the request of the OP I am posting my original comment as an answer even though there are other answers stating the same thing:

You need to clearly specify that the block takes no parameters. Your typedef should be:

typedef void (^myBlock)(void);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM