Objective-C:如何将对象作为块参数传递给期望其基类的方法?

时间:2013-03-06 23:57:13

标签: objective-c objective-c-blocks

如果我有以下物品:

@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中一样。

有没有办法以某种方式实现这一目标?

2 个答案:

答案 0 :(得分:8)

不幸的是,这是Blocks API的限制。如果您愿意,您可以选择完全放弃类型安全并将块声明为:

+(void) doSomething:(void (^)(id)) obj;

允许您设置块参数的类。但同样,这是完全不安全,类型。

答案 1 :(得分:2)

使用id代替Complex *Simple *。块参数类型的处理方式与方法参数类型不同(感谢@CodaFi)