Swift 3.2 - 编译器不允许我使用 Darwin.kevent 全局函数
Posted
技术标签:
【中文标题】Swift 3.2 - 编译器不允许我使用 Darwin.kevent 全局函数【英文标题】:Swift 3.2 - compiler doesn't let me use the Darwin.kevent global function 【发布时间】:2017-09-19 05:22:37 【问题描述】:这在 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:'
问题似乎是由于Darwin
模块同时导出了同名的结构和函数-kevent
,并且编译器没有选择全局函数而是要我添加结构初始化器标签,这对我不起作用,因为参数列表不匹配。
kevent
结构初始化器看起来像这样
public init(ident: UInt, filter: Int16, flags: UInt16, fflags: UInt32, data: Int, udata: UnsafeMutableRawPointer!)
我什至尝试将所有参数声明为局部变量(如示例代码中所示),以确保没有类型推断会导致函数调用不正确,这可能导致编译器认为我想使用结构。没有运气。
有人知道这个“重载”问题的解决方案吗?
【问题讨论】:
kevent(kq, changelist, nchanges, eventlist, nevents, timeout)
没有 Darwin 前缀编译对我来说没有问题。
@MartinR 哇,简直不敢相信解决方案这么简单:)。你应该用这个发布答案。
【参考方案1】:
我不能告诉你为什么完全限定的函数名不能用 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) 编译,因此您可能需要提交错误 报告。
【讨论】:
以上是关于Swift 3.2 - 编译器不允许我使用 Darwin.kevent 全局函数的主要内容,如果未能解决你的问题,请参考以下文章
Array<MutableCollection> 的 Swift 扩展不允许 reverse()
使用 Swift 4.0 编译的模块无法在 Swift 3.1 中导入框架二进制文件