【问题标题】:Is it safe to ignore compiler warning caused by referring to dispatch_queue_t from Swift?忽略从 Swift 引用 dispatch_queue_t 引起的编译器警告是否安全?
【发布时间】:2017-04-04 06:43:12
【问题描述】:

我有一个具有以下属性的 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?
}

我的问题仍然是:让这个警告静音对我来说安全吗?我应该提交雷达吗?

【问题讨论】:

  • 我仍然无法重现。但是,我注意到您的声明前后不一致。一方面,您声明了一个属性@property (nonatomic, strong, readonly)。但是协议说@property (nonatomic, strong, readonly, nullable)。当我把协议和属性结合起来,当我在我的 Swift 代码中确认这个东西现在是一个 Optional 时,一切都很好。

标签: objective-c swift3


【解决方案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 {}
    }
}

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

【讨论】:

  • 这太奇怪了!我已经尝试删除我的派生数据并进行清理和构建,但我仍然遇到问题!为什么我生成的标题会有所不同?我正在使用 Xcode 8.1。
  • 我唯一能想到的是你的情况还有一些你没有提到的更复杂的情况(因为你不知道它是相关的,我当然不知道是什么它是要么)。 :) 如果您愿意,我很乐意为您提供我的测试项目。稍等一下,我会把它放在我的保管箱里……
  • 我发现了问题!请参阅我的问题的编辑。
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
相关资源
最近更新 更多