我之前曾在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 
}

Swift 5.0不推荐使用withUnsafeBytes.我该怎么解决这个问题?

推荐答案

在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字节边界上为aligned.有关替代方案,请参见round trip Swift number types to/from Data.

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

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

Swift相关问答推荐

在列表项内的NavigationLink中的按钮无法正常工作

SWIFT中MAP的静态方法包装器

如何访问用户选定目录下的(只读)文件?

在visionOS 1.0中已弃用';base Color';:请改用`Color`属性

Swift中从头开始的基本HTTP客户端

Swift UI中视图上的值未更新

如何在 Swift 中做类型安全的索引?

如何在 swift 5.0 中获取当前行

Swift-如何接受多个(联合)类型作为参数

故事板未在助手中显示视图控制器

在 Swift 5.5 中编写同步和异步函数

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

将项目引用添加到 Swift iOS XCode 项目并调试

在运行时访问 UIView 宽度

在 Xcode 中自动实现 Swift 协议方法

Swift 动画 WithDuration 语法是什么?

Swift 协议只能设置?

如何在 SwiftUI 中创建带有图像的按钮?

在 Swift 中子类化 NSObject - 初始化器的最佳实践

如何快速将弹出框调整为表格视图中内容的大小?