这在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:标志:fflag:data:udata:’in call
造成这些问题的原因似乎是,Darwin
模块同时导出了一个相同名称的函数-- kevent
,编译器没有选择全局函数,而是希望我添加结构初始化器标签,因为参数列表不匹配,这对我不起作用。
kevent
结构初始化器如下所示
public init(ident: UInt, filter: Int16, flags: UInt16, fflags: UInt32, data: Int, udata: UnsafeMutableRawPointer!)
我甚至尝试将所有参数声明为局部变量(如样例代码中的那样),以确保没有类型推断会使函数调用不正确,这可能会导致编译器认为我想使用结构。不走运。
有人知道这个“超载”问题的解决办法吗?
发布于 2017-09-18 21:52:16
我不能告诉您为什么完全限定的函数名不使用Swift 3.2编译,但是
kevent(kq, changelist, nchanges, eventlist, nevents, timeout)
没有达尔文前缀,编译就没有问题(用Xcode 9 GM、Swift 3.2和Swift 4进行测试)。
我可以确认
Darwin.kevent(kq, changelist, nchanges, eventlist, nevents, timeout)
使用Swift 3.1 (Xcode 8.3.3)编译,因此您可能需要提交错误报告。
https://stackoverflow.com/questions/46292405
复制相似问题