如果我有以下物品:
@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) {
}];
编译器说:
Incompatible block pointer types sending 'void (^)(Complex *__strong)' to parameter of type 'void (^)(Simple *__strong)'
因为Complex
扩展了Simple
,我认为这会起作用,就像在Java中一样。
有没有办法以某种方式实现这一目标?
答案 0 :(得分:8)
不幸的是,这是Blocks API的限制。如果您愿意,您可以选择完全放弃类型安全并将块声明为:
+(void) doSomething:(void (^)(id)) obj;
允许您设置块参数的类。但同样,这是完全不安全,类型。
答案 1 :(得分:2)
使用id
代替Complex *
或Simple *
。块参数类型的处理方式与方法参数类型不同(感谢@CodaFi)