我遇到了一些关于目标 c 块的非常烦人的问题。假设我们有这样的代码:
//Class1.h
#import <Foundation/Foundation.h>
typedef void (^Class1Callback)(BOOL bl);
@interface Class1 : NSObject { }
- (id)initWithCallback:(Class1Callback)callback;
@end
//Class2.h
#import <Foundation/Foundation.h>
typedef enum Class2Enum { Foo, Bar, FooBar } Class2Enum;
typedef void (^Class2Callback)(Class2Enum ce);
@interface Class2 : NSObject { }
- (id)initWithCallback:(Class2Callback)callback;
@end
//main.c
#import "Class1.h"
#import "Class2.h"
int main(int argc, char *argv[]) {
Class1 *class1 = [[Class1 alloc] initWithCallback:^(BOOL bl){ }];
Class2 *class2 = [[Class2 alloc] initWithCallback:^(Class2Enum ce){ }];
}
在此代码中,我收到错误“初始化'void (^)(enum Class2Enum)'的不兼容块指针类型,预期'Class1Callback'”行
Class2 *class2 = [[Class2 alloc] initWithCallback:^(Class2Enum ce){ }];
但是当我只是在 main.c 中反向导入时,即
#import "Class2.h"
#import "Class1.h"
错误改变了它的位置和描述 - 现在它是一致的
Class1 *class1 = [[Class1 alloc] initWithCallback:^(BOOL bl){ }];
并且描述是“初始化'void(^)(BOOL)'的不兼容块指针类型,预期'Class2Callback'”
当方法的声明说块类型是 Class1Callback 时,为什么编译器会期望“Class2Callback”?我不知道它为什么会发生,我应该在哪里寻找以及我应该阅读什么来找到答案。有什么建议么?