你想得太复杂了:
func getUUID ( ) -> Data {
let uuid = NSUUID()
var bytes = [UInt8](repeating: 0, count: 16)
uuid.getBytes(&bytes)
return Data(bytes: bytes)
}
为什么这行得通?
考虑你有:
func printInt(atAddress p: UnsafeMutablePointer<Int>) {
print(p.pointee)
}
那么你实际上可以这样做:
var value: Int = 23
printInt(atAddress: &value)
// Prints "23"
但你也可以这样做:
var numbers = [5, 10, 15, 20]
printInt(atAddress: &numbers)
// Prints "5"
这是“隐式桥接”的一种形式。引用Swiftdoc.org的话:
使用 inout 语法传递数组时,会隐式创建指向数组元素的可变指针。
这种隐式桥接只保证有效的指针,直到当前函数返回。此类指针绝不能“转义”当前函数上下文,但将它们用作 inout 参数始终是安全的,因为 inout 参数始终只保证在被调用函数返回之前有效,并且被调用函数必须在当前函数之前返回,所以这不会出错。
对于那些不知道的人,转换UUID
为NSUUID
( ... as NSUUID
) 和反之 ( ... as UUID
) 保证总是成功。但是如果你坚持使用UUID
,最简单的方法是:
private
func getUUID ( ) -> Data {
var uuid = UUID().uuid
return withUnsafePointer(to: &uuid) {
return Data(bytes: $0, count: MemoryLayout.size(ofValue: uuid))
}
}