Saltar al contenido

Obtener datos de UUID en Swift 3

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 UInt8s 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 UInt8por favor hable.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *