2017-09-19 80 views
2

這是在Swift 3.1中工作的,但是一旦我切換到Xcode 9,它就停止編譯。下面是一個示例代碼:Swift 3.2 - 編譯器不讓我使用Darwin.kevent全局函數

let kq: Int32 = 0 
let changelist: UnsafePointer<kevent>! = nil 
let nchanges: Int32 = 0 
let eventlist: UnsafeMutablePointer<kevent>! = nil 
let nevents: Int32 = 0 
let timeout: UnsafePointer<timespec>! = nil 
Darwin.kevent(kq, changelist, nchanges, eventlist, nevents, timeout) 

錯誤是

error: missing argument labels 'ident:filter:flags:fflags:data:udata:' in call

的問題似乎是由這樣的事實引起了Darwin模塊出口既是結構的一個具有相同名稱的功能 - kevent,和編譯器不會選擇全局函數,而是希望我添加結構初始化程序標籤,由於參數列表不匹配,所以對我無效。

kevent結構initalizer看起來像這樣

public init(ident: UInt, filter: Int16, flags: UInt16, fflags: UInt32, data: Int, udata: UnsafeMutableRawPointer!) 

我甚至試過宣佈所有參數作爲本地變量(如示例代碼),以確保沒有類型推斷,這將使該功能調用不正確,這可能會導致編譯器認爲我想使用該結構。沒有運氣。

有沒有人知道這個「超載」問題的解決方案?

+2

沒有達爾文前綴的'kevent(kq,changelist,nchanges,eventlist,nevents,timeout)'沒有爲我編譯沒有問題。 –

+0

@MartinR哇,不能相信解決方案是那麼簡單:)。你應該發佈一個答案。 – Cristik

回答

2

我不能告訴你爲什麼完全合格的函數名稱不與雨燕3.2編譯,但

kevent(kq, changelist, nchanges, eventlist, nevents, timeout) 

沒有達爾文前綴編譯沒有問題(在Xcode 9測試GM,雨燕3.2和斯威夫特4 )。

我可以證實,

Darwin.kevent(kq, changelist, nchanges, eventlist, nevents, timeout) 

與雨燕3.1(Xcode中8.3.3)編譯,所以你可能要提交Bug報告 。