从Swift 3中的UUID获取数据

时间:2017-01-11 18:14:28

标签: objective-c swift swift3 uuid

我在Objective C中编写了以下代码,我试图在Swift 3中工作。某些等效的函数似乎在Swift 3中不可用。这里的代码是Objective C中的代码

NSUUID *vendorIdentifier = [[UIDevice currentDevice] identifierForVendor];
uuid_t uuid;
[vendorIdentifier getUUIDBytes:uuid];
NSData *vendorData = [NSData dataWithBytes:uuid length:16];

和我目前在Swift 3中所做的努力,它编译并运行但没有给出正确的答案。

let uuid = UIDevice.current.identifierForVendor?.uuidString
let uuidData = uuid?.data(using: .utf8)
let uuidBytes = uuidData?.withUnsafeBytes { UnsafePointer<UInt8>($0) }
let vendorData : NSData  = NSData.init(bytes: uuidBytes, length: 16)
let hashData = NSMutableData()
hashData.append(vendorData as Data)

6 个答案:

答案 0 :(得分:6)

uuid的{​​{1}}属性是一个导入Swift的C数组 作为一个元组。使用Swift保留内存布局的事实 对于导入的C结构,可以将指针传递给元组 到UUID构造函数:

Data(bytes:, count:)

Swift 4.2(Xcode 10)开始,您不需要制作一个可变的 先复制:

if let vendorIdentifier = UIDevice.current.identifierForVendor {
    var uuid = vendorIdentifier.uuid
    let data = withUnsafePointer(to: &uuid) {
        Data(bytes: $0, count: MemoryLayout.size(ofValue: uuid))
    }

    // ...
}

答案 1 :(得分:5)

这是一种可能的方式。请注意,identifierForVendor会在Swift 3中返回UUIDUUID具有uuid属性,可为您提供uuid_tuuid_t是16个UInt8值的元组。

因此,技巧是将字节元组转换为字节数组。然后,从数组中创建Data是微不足道的。

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)
}

如果有人知道将UInt8元组转换为UInt8数组的更好方法,请大声说出来。

答案 2 :(得分:2)

要在Swift 4.2中将UUID转换为Data,我使用了此方法:

let uuid = UUID()
withUnsafeBytes(of: uuid.uuid, { Data($0) })

答案 3 :(得分:1)

我所做的此扩展似乎在不使用反射或指针的情况下也能很好地工作。这取决于事实,即Swift中的UUID表示为16个UInt8的元组,可以像这样简单地对其进行包装:

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())
    }
}

答案 4 :(得分:1)

在Swift 5中,我使用uuidString来将UUID转换为数据:

npm build

答案 5 :(得分:0)

Swift 4.2扩展

public extension UUID {

    var data: Data {
        return withUnsafeBytes(of: self.uuid, { Data($0) })
    }

}