忽略通过引用Swift中的dispatch_queue_t引起的编译器警告是否安全?

时间:2016-11-20 23:12:18

标签: objective-c swift3

我有一个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?
}

我的问题仍然是:对我这个警告保持沉默是否安全?我应该提交雷达吗?

1 个答案:

答案 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 {}
    }
}

在直接实例方法调用和扩展中都没有看到任何警告。