我有一个Objective C类,它具有以下属性:
@property (nonatomic, strong, readonly) dispatch_queue_t couchDispatchQueue;
我有一个类的Swift扩展,我引用那个属性:
couchDispatchQueue.async {
当我这样做时,我收到以下编译器警告:
属性类型'OS_dispatch_queue * _Nullable'与从'BZCouchDatabase'继承的类型'dispatch_queue_t _Nullable'(又名'NSObject *')不兼容
我明白为什么,因为我的应用生成的App-Swift.h
文件有:
@property (nonatomic, readonly, strong) OS_dispatch_queue * _Nullable couchDispatchQueue;
而dispatch_queue_t
定义为:
typedef NSObject<OS_dispatch_queue> *dispatch_queue_t;
修改
我已经找到了原始描述中遗漏的“进一步复杂化”。 Objective C协议需要此属性,该协议也需要从NSObject继承。一旦我使Swift类继承自NSObject并符合目标C协议,我就会收到警告。以下示例代码足以引发警告:
目标C:
@protocol Thingness
@property (nonatomic, strong, readonly, nullable) dispatch_queue_t couchDispatchQueue;
@end
夫特:
class Thing: NSObject, Thingness {
var couchDispatchQueue: DispatchQueue?
}
我的问题仍然是:对我这个警告保持沉默是否安全?我应该提交雷达吗?
答案 0 :(得分:1)
描述得非常好 - 但我无法重现它。当我宣布
时@property (nonatomic, strong, readonly) dispatch_queue_t couchDispatchQueue;
在Objective-C类文件中,生成的标题显示
open var couchDispatchQueue: DispatchQueue! { get }
因此,这被视为正常的Swift 3 DispatchQueue,而我对couchDispatchQueue.async
的调用根本不会产生任何警告。
要说清楚,我尝试了两种方法。我在 .h 文件中为Thing类声明了couchDispatchQueue
属性。我将 Thing.h 导入Swift。然后我在Swift中编写了这段代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Thing().couchDispatchQueue.async {}
}
}
extension Thing {
func test() {
self.couchDispatchQueue.async {}
}
}
在直接实例方法调用和扩展中都没有看到任何警告。