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

Mar*_*ark 7 objective-c objective-c-blocks

如果我有以下对象:

@interface Simple : NSObject

@end

@interface Complex : Simple

@end
Run Code Online (Sandbox Code Playgroud)

另一个对象如:

@interface Test : NSObject 

+(void) doSomething:(void (^)(Simple*)) obj;

@end
Run Code Online (Sandbox Code Playgroud)

如果我调用这样的方法,一切都有效:

[Test doSomething:^(Simple * obj) {

}];
Run Code Online (Sandbox Code Playgroud)

当我尝试改为称之为:

[Test doSomething:^(Complex * obj) {

}];
Run Code Online (Sandbox Code Playgroud)

编译器说:

Incompatible block pointer types sending 'void (^)(Complex *__strong)' to parameter of type 'void (^)(Simple *__strong)'

因为Complex扩展Simple,我认为这会起作用,就像在Java中一样.

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

Cod*_*aFi 8

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

+(void) doSomething:(void (^)(id)) obj;
Run Code Online (Sandbox Code Playgroud)

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