Вы думаете слишком сложно:
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))
}
}
Я хотел бы получить свой вклад тогда, у меня есть 3 'Data' вары, чей' bytes' мне нужно перейти к 'SHA1_Update' в последовательности ,Действительно ли рекомендуемый поток имеет 3 вложенных блока 'withUnsafeBytes'? – ray
@ray, кажется, что это правильный путь при работе с 'Data' в Swift 3. Или вы можете работать с' Unsafe [Mutable] Pointer'. Кто-то (штат Apple в форуме разработчиков Apple) предложил написать более Swifty-обертку в C/Objective-C. – OOPer