如果我有以下对象:
@interface Simple : NSObject
@end
@interface Complex : Simple
@end
还有另一个对象:
@interface Test : NSObject
+(void) doSomething:(void (^)(Simple*)) obj;
@end
如果我像这样调用方法,一切正常:
[Test doSomething:^(Simple * obj) {
}];
当我尝试这样调用它时:
[Test doSomething:^(Complex * obj) {
}];
编译器说:
不兼容的 block 指针类型将“void (^)(Complex *__strong)”发送到“void (^)(Simple *__strong)”类型的参数
因为 Complex
扩展了 Simple
,我认为这会起作用,就像在 Java 中一样。
有没有办法以某种方式实现这一目标?
最佳答案
不幸的是,这是 Blocks API 的限制。如果愿意,您可以选择完全放弃类型安全并将 block 声明为:
+(void) doSomething:(void (^)(id)) obj;
它允许您设置 block 参数的类。但同样,这在类型方面完全不安全。
关于Objective-C:如何将对象作为 block 参数传递给需要其基类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15260578/