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中一样.
有办法以某种方式实现这一目标吗?
不幸的是,这是Blocks API的限制.如果您愿意,您可以选择完全放弃类型安全并将块声明为:
+(void) doSomething:(void (^)(id)) obj;
Run Code Online (Sandbox Code Playgroud)
这允许您设置块的参数的类.但同样,这种类型完全不安全.
| 归档时间: |
|
| 查看次数: |
1259 次 |
| 最近记录: |