これは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
構造体私は構造体を使用したかったとコンパイラに考えさせる可能性があります。運がない。
この「オーバーロード」問題の解決策を知っている人はいますか?
'kevent(kq、changelist、nchanges、eventlist、nevents、timeout)'はDarwin接頭辞なしで問題なくコンパイルできます。 –
@MartinRうわー、解決策がそれほど単純ではないとは思えません:)。これで回答を投稿するべきです。 – Cristik