And*_*rew 2 uuid objective-c swift swift3
我在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];
Run Code Online (Sandbox Code Playgroud)
我目前在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)
Run Code Online (Sandbox Code Playgroud)
我做的这个扩展似乎在不使用反射和指针的情况下工作得很好。这取决于这样一个事实,即 Swift 中的 UUID 表示为一个 16UInt8秒的元组,可以像这样简单地展开:
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())
}
}
Run Code Online (Sandbox Code Playgroud)
所述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))
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
从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))
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是一种可能的方式.请注意,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)
}
Run Code Online (Sandbox Code Playgroud)
如果有人知道将元组UInt8转换为数组的更好方法UInt8,请大声说出来.
要转换UUID到Data在雨燕4.2,我用这个:
let uuid = UUID()
withUnsafeBytes(of: uuid.uuid, { Data($0) })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2277 次 |
| 最近记录: |