当尝试将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