swift 5.0 : 'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(. ..)

标签 swift deprecated unsafe-pointers

我之前在 Swift 4.2 中使用此代码来生成 id:

public static func generateId() throws -> UInt32 {
    let data: Data = try random(bytes: 4)
    let value: UInt32 = data.withUnsafeBytes { $0.pointee } // deprecated warning!
    return value // + some other stuff 
}

withUnsafeBytes 在 Swift 5.0 上已弃用。我该如何解决这个问题?

最佳答案

在 Swift 5 中,DatawithUnsafeBytes() 方法使用(无类型)UnsafeRawBufferPointer 调用闭包,您可以 load()原始内存中的值:

let value = data.withUnsafeBytes { $0.load(as: UInt32.self) }

(比较 Swift 论坛中的 How to use Data.withUnsafeBytes in a well-defined manner?)。请注意,这要求内存在 4 字节边界上对齐。有关替代方案,请参阅 round trip Swift number types to/from Data .

另请注意,从 Swift 4.2 开始,您只需使用新的 Random API 即可创建随机 32 位整数。 :

let randomId = UInt32.random(in: .min ... .max)

关于 swift 5.0 : 'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(. ..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57847125/

相关文章:

ios - 访问错误、多线程、GCD、swift

swift - Swift 3 开发快照中的 POST 请求给出 "ambiguous reference to member ' dataTask(带有 :completionHandler:)'

ios - 如何修复无法将类型 'AnyObject' 的值转换为预期参数类型 '_?' 错误?

ios - 如何在 searchBar 中设置 http 不区分大小写?

facebook - 旧的 Facebook离线访问 token 是否可以在离线访问已弃用的情况下继续使用?

android - 如何获取 ViewModel?

ruby-on-rails - Rails 3.1.0 Assets 文件夹未呈现:不建议使用Sprockets::Environment#static_root

c# - 不安全代码中的错误,使用指针读取内存

ios - 在 Swift 中从 NSData 读取时的 EXC_ARM_DA_ALIGN

go - 从字节 slice 到不安全结构的类型转换