Te damos la bienvenida a nuestra comunidad, en este lugar vas a encontrar la respuesta a lo que estás buscando.
Solución:
los uuid
propiedad de UUID
es una c array with se importa a Swift como una tupla. Usando el hecho de que Swift conserva el diseño de la memoria de las estructuras C importadas, puede pasar un puntero a la tupla al Data(bytes:, count:)
constructor:
if let vendorIdentifier = UIDevice.current.identifierForVendor
var uuid = vendorIdentifier.uuid
let data = withUnsafePointer(to: &uuid)
Data(bytes: $0, count: MemoryLayout.size(ofValue: uuid))
// ...
A partir de Rápido 4.2 (Xcode 10) no necesitas hacer una copia mutable primero:
if let vendorIdentifier = UIDevice.current.identifierForVendor
let data = withUnsafePointer(to: vendorIdentifier.uuid)
Data(bytes: $0, count: MemoryLayout.size(ofValue: vendorIdentifier.uuid))
// ...
Esta extensión que hice parece funcionar muy bien sin usar reflejos ni punteros. Depende del hecho de que UUID en Swift se representa como una tupla de 16 UInt8
s que simplemente se pueden desenvolver así:
extension UUID
public func asUInt8Array() -> [UInt8]
let (u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15,u16) = self.uuid
return [u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15,u16]
public func asData() -> Data
return Data(self.asUInt8Array())
Aquí hay una forma posible. Tenga en cuenta que identifierForVendor
devoluciones UUID
en Swift 3. UUID
tiene un uuid
propiedad que le da una uuid_t
. uuid_t
es una tupla de 16 UInt8
valores.
Así que el truco es convertir la tupla de bytes en un array de bytes Entonces es trivial crear el Data
desde el array.
if let vendorIdentifier = UIDevice.current.identifierForVendor
let uuid = vendorIdentifier.uuid // gives a uuid_t
let uuidBytes = Mirror(reflecting: uuid).children.map($0.1 as! UInt8) // converts the tuple into an array
let vendorData = Data(bytes: uuidBytes)
Si alguien sabe una mejor manera de convertir una tupla de UInt8
en una array de UInt8
por favor hable.