当尝试将AbsoluteTime类型用于IOKit HID代码时,Swift编译器似乎非常困惑。

该块将编译并正常运行,并显示“UnsignedWide”。

import IOKit.hid

var event = IOHIDEventStruct()
let timestamp = event.timestamp
let lo: UInt32 = timestamp.lo
let hi: UInt32 = timestamp.hi
let newTime = event.timestamp.dynamicType.init(lo: lo, hi: hi)
event.timestamp = newTime
print(timestamp.dynamicType)

但是,这不会编译。
let time1: AbsoluteTime = event.timestamp

"error: use of undeclared type 'AbsoluteTime'"

这也不会编译。
let wide1: UnsignedWide = event.timestamp

"error: use of undeclared type 'UnsignedWide'"

这也无法编译,但这是预料之中的。
let uint: UInt64 = event.timestamp

"error: cannot convert value of type 'AbsoluteTime' (aka 'UnsignedWide') to specified type 'UInt64'"

因此,由于Swift清楚地知道UnsignedWide是具有两个UInt32字段的结构,因此我认为我将尝试仅使用这些特性定义自己的结构,但这也失败了。
struct UnsignedWide {
    let lo: UInt32
    let hi: UInt32
}
typealias AbsoluteTime = UnsignedWide
let time2: AbsoluteTime = event.timestamp
let wide2: UnsignedWide = event.timestamp

"error: cannot convert value of type 'AbsoluteTime' (aka 'UnsignedWide') to specified type 'AbsoluteTime' (aka 'UnsignedWide')"
"error: cannot convert value of type 'AbsoluteTime' (aka 'UnsignedWide') to specified type 'UnsignedWide'"

至少可以这样。
let time3: AbsoluteTime = unsafeBitCast(event.timestamp, AbsoluteTime.self)

我宁愿不这样做,但我只能用这种丑陋来创建AbsoluteTime变量。
let AbsoluteTime = event.timestamp.dynamicType
let time4 = AbsoluteTime.init(lo: lo, hi: hi)

不幸的是,这不允许我将AbsoluteTime用作函数或struct或诸如此类的类型,因此这并不能真正解决我的问题。

Xcode 7.3和Xcode 7.3.1 GM就是这种情况。

有人知道解决方案吗?

最佳答案

使用Darwin.UnsignedWide别名的AbsoluteTime
例如。:

这样编译:

import Darwin

public protocol CurrentAbsoluteTimeProvider: class {
    func currentAbsoluteTime() -> Darwin.AbsoluteTime
}

无法编译:
import Darwin

public protocol CurrentAbsoluteTimeProvider: class {
    func currentAbsoluteTime() -> AbsoluteTime
}

我已将此文件添加到使用IOKit的库中:https://github.com/avito-tech/Mixbox/blob/e3a5991f61dd2a36e13193e67ca69743f5bb62c7/Frameworks/Foundation/CurrentAbsoluteTimeProvider/AbsoluteTime/AbsoluteTime.swift

顺便说一句,我们公司正在开发一个用于IOKit的Swift库。固定链接:https://github.com/avito-tech/Mixbox/tree/e3a5991f61dd2a36e13193e67ca69743f5bb62c7/Frameworks/IoKit

08-07 22:28