Sie denken zu kompliziert:
func getUUID () -> Data {
let uuid = NSUUID()
var bytes = [UInt8](repeating: 0, count: 16)
uuid.getBytes(&bytes)
return Data(bytes: bytes)
}
Warum diese Arbeit?
Betrachten Sie haben:
func printInt(atAddress p: UnsafeMutablePointer<Int>) {
print(p.pointee)
}
dann können Sie in der Tat dies tun:
var value: Int = 23
printInt(atAddress: &value)
// Prints "23"
aber Sie können dies auch tun:
var numbers = [5, 10, 15, 20]
printInt(atAddress: &numbers)
// Prints "5"
Es ist eine Form der „impliziten ist Überbrückung". Zitat aus Swiftdoc.org:
Ein wandelbaren Zeiger auf die Elemente eines Arrays implizit erstellt, wenn Sie das Array mit inout Syntax übergeben.
Diese implizite Überbrückung garantiert nur gültige Zeiger, bis die aktuelle Funktion zurückkehrt. Solche Zeiger dürfen niemals den aktuellen Funktionskontext "verlassen", aber sie als inout-Argument zu verwenden ist immer sicher, da inout-Argumente immer nur gültig sind, bis die aufgerufene Funktion zurückkehrt und die aufgerufene Funktion vor dem aktuellen zurückkehren muss. Das kann also nicht schiefgehen.
Und für diejenigen, die nicht wissen, Gießen UUID
zu NSUUID
(... as NSUUID
) und umgekehrt (... as UUID
) immer gelingt garantiert. Aber wenn Sie darauf bestehen, UUID
verwenden, ist der einfachste Weg:
private
func getUUID () -> Data {
var uuid = UUID().uuid
return withUnsafePointer(to: &uuid) {
return Data(bytes: $0, count: MemoryLayout.size(ofValue: uuid))
}
}
Ich mag würde Ihre Eingabe dann bekommen, habe ich 3 'Data' Vars dessen' bytes' ich 'SHA1_Update' nacheinander passieren müssen .Ist der empfohlene Fluss wirklich 3 verschachtelte Blöcke von 'withUnsafeBytes'? – ray
@ray, scheint das der richtige Weg zu sein, wenn man in Swift 3 mit 'Data' arbeitet. Oder man kann mit' Unsafe [Mutable] Pointer' arbeiten. Jemand (Apples Mitarbeiter im Dev-Forum von Apple) hat vorgeschlagen, in C/Objective-C einen Swifty-Wrapper zu schreiben. – OOPer