Objective-C:如何将对象作为 block 参数传递给需要其基类的方法?

标签 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) {

}];

编译器说:

不兼容的 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/

相关文章:

ios - iOS9 的 WKWebview 不支持原始 IP 地址的 Websocket 和 Restful

ios - 如何在这个 block 中强烈修复 "Capturing ' block '很可能导致保留循环'

ios - Objective-C 回调/ block 模式

iphone - Objective C ivars 或 @property

objective-c - UIPopoverController 内存崩溃

objective-c - 导航栏按钮背景图片大小

objective-c - 在 Swift 中像 Objective-C 一样使用常量

ios - 了解使用对象 C 进行编程的 block

objective-c - block 和线程

objective-c - Objective-C 中的 block 变量