Swift 3.2 - 编译器不允许我使用Darwin.kevent全局函数

时间:2017-09-19 05:22:38

标签: swift swift3.2

这在Swift 3.1中有效,但是一旦我切换到Xcode 9,它就停止了编译。这是一个示例代码:

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)

错误是

  

错误:缺少参数标签'ident:filter:flags:fflags:data:udata:'in call

问题似乎是由Darwin模块导出结构和具有相同名称的函数kevent这一事实引起的,并且编译器不选择全局函数而是我希望我添加struct initializer标签,这对我来说不起作用,因为参数列表不匹配。

kevent struct initalizer看起来像这样

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

我甚至尝试将所有参数声明为局部变量(如示例代码中所示),以确保没有类型推断会导致函数调用不正确,这可能导致编译器认为我想使用结构。没有运气。

有人知道这个“重载”问题的解决方案吗?

1 个答案:

答案 0 :(得分:2)

我不能告诉你为什么完全限定的函数名不能用Swift 3.2编译,但是

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

没有Darwin前缀编译没有问题(使用Xcode 9 GM,Swift 3.2和Swift 4进行测试)。

我可以确认

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

使用Swift 3.1(Xcode 8.3.3)进行编译,因此您可能希望提交错误 报告。