2017-09-19 3 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モジュールの輸出構造体AN同じ名前の関数の両方という事実に起因すると思わある - kevent、およびコンパイラはグローバル関数を選択せず​​、代わりに構造体イニシャライザのラベルを追加したいと考えています。これは、パラメータリストが一致しないときには機能しません。

機能になるだろう何の型推論がないことを確認するために、私も(サンプルコードのように)ローカル変数として、すべての引数を宣言しようとしたこの

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

のように見えますinitalizer kevent構造体私は構造体を使用したかったとコンパイラに考えさせる可能性があります。運がない。

この「オーバーロード」問題の解決策を知っている人はいますか?

+2

'kevent(kq、changelist、nchanges、eventlist、nevents、timeout)'はDarwin接頭辞なしで問題なくコンパイルできます。 –

+0

@MartinRうわー、解決策がそれほど単純ではないとは思えません:)。これで回答を投稿するべきです。 – Cristik

答えて

2

Xcodeの9 GM、スウィフト3.2とスウィフト4でテスト(私はあなたに完全修飾関数名はスウィフト3.2でコンパイルしない理由を伝えることはできませんが、ダーウィンの接頭辞なし

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

は問題なくコンパイル)。

私は

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

はスウィフト3.1(Xcodeの8.3.3)でコンパイルするので、あなたはバグ レポートを提出したい場合がありますことを確認することができます。

関連する問題