あなたはあまりにも複雑に考えています:
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))
}
}