2016-11-20 31 views
1

我有具有以下性質的目標C類:忽略由Swift引用dispatch_queue_t引起的編譯器警告是否安全?

@property (nonatomic, strong, readonly) dispatch_queue_t couchDispatchQueue; 

我有類的夫特延伸,其中我引用屬性像這樣:

couchDispatchQueue.async { 

當我做到這一點,我得到下面的編譯器警告:

房產類型 'OS_dispatch_queue * _Nullable' 與類型 'dispatch_queue_t _Nullable'(又名 'NSObject的*')不兼容的「BZCou繼承chDatabase'

我明白爲什麼,因爲我的應用程序的生成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

我仍然無法重現。不過,我注意到你的申請中有不一致之處。一方面你聲明一個屬性'@property(非原子,強壯,只讀)'。但協議說'@屬性(非原子,強壯,只讀,可空)'。當我將協議和屬性放在一行時,並且當我在我的Swift代碼中承認此事現在是可選時,一切都很好。 – matt

回答

1

很好描述的情況 - 但我不能再現它。當我聲明

@property (nonatomic, strong, readonly) dispatch_queue_t couchDispatchQueue; 
在一個Objective-C類文件

,將所生成的標題顯示我

open var couchDispatchQueue: DispatchQueue! { get } 

這因此視爲正常夫特3 DispatchQueue,以及我的對couchDispatchQueue.async呼叫不產生警告,在所有。

要說清楚,我嘗試了兩種方法。我爲Thing類的.h文件聲明couchDispatchQueue屬性。我將Swing.h導入。然後我在斯威夫特寫了這個代碼:

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     Thing().couchDispatchQueue.async {} 
    } 
} 

extension Thing { 
    func test() { 
     self.couchDispatchQueue.async {} 
    } 
} 

無論在直線實例方法調用,也不在擴展做我看到任何警告。

+0

奇怪!我嘗試刪除我的派生數據並進行清理和構建,但我仍然遇到問題!爲什麼我的頭文件會有所不同?我正在使用Xcode 8.1。 –

+0

我能想到的唯一的事情是,在你的情況中還有一些你沒有提到的複雜因素(因爲你不知道它是相關的,我當然也不知道它是什麼)。 :)如果你喜歡,我很樂意給你我的測試項目。稍等片刻,我會把它放在我的保管箱中... – matt

+0

Here you go:https://www.dropbox.com/s/c1mc7csbkgrkx36/Test.zip?dl=0 – matt