当前位置:  开发笔记 > IOS > 正文

从Swift 3中的UUID获取数据

如何解决《从Swift3中的UUID获取数据》经验,为你挑选了2个好方法。

我在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($0) }
let vendorData : NSData  = NSData.init(bytes: uuidBytes, length: 16)
let hashData = NSMutableData()
hashData.append(vendorData as Data)

Martin R.. 7

所述uuid的属性UUID是一个C阵列导入到快速作为一个元组.使用Swift保留导入的C结构的内存布局这一事实,您可以将指向元组的指针传递给Data(bytes:, count:)构造函数:

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

    // ...
}

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

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

    // ...
}


rmaddy.. 5

这是一种可能的方式.请注意,Swift 3 中的identifierForVendor返回具有一个属性,可以为您提供.是一个由16个值组成的元组.UUIDUUIDuuiduuid_tuuid_tUInt8

所以诀窍是将字节元组转换为字节数组.然后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,请大声说出来.



1> Martin R..:

所述uuid的属性UUID是一个C阵列导入到快速作为一个元组.使用Swift保留导入的C结构的内存布局这一事实,您可以将指向元组的指针传递给Data(bytes:, count:)构造函数:

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

    // ...
}

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

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

    // ...
}



2> rmaddy..:

这是一种可能的方式.请注意,Swift 3 中的identifierForVendor返回具有一个属性,可以为您提供.是一个由16个值组成的元组.UUIDUUIDuuiduuid_tuuid_tUInt8

所以诀窍是将字节元组转换为字节数组.然后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,请大声说出来.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有