在 Swift 3.1 中,不推荐使用 UnsafeMutablePointer.initialize(from:)

Posted

技术标签:

【中文标题】在 Swift 3.1 中,不推荐使用 UnsafeMutablePointer.initialize(from:)【英文标题】:In Swift 3.1, UnsafeMutablePointer.initialize(from:) is deprecated 【发布时间】:2017-04-30 17:43:11 【问题描述】:

。 Xcode 建议我改用 UnsafeMutableBufferPointer.initialize(from:) 。我有一个看起来像这样的代码块:

let pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)
pointer.initialize(from: repeatElement(0, count: 64))

由于弃用,代码给了我一个编译时警告。所以我要把它改成:

let pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)
let buffer = UnsafeMutableBufferPointer(start: pointer, count: 64)
_ = buffer.initialize(from: repeatElement(0, count: 64))

这是正确的方法吗?我只是想确保我做得正确。

【问题讨论】:

【参考方案1】:

这是正确的,但您可以使用更简单的方式分配和初始化内存

let pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: 64)
pointer.initialize(to: 0, count: 64)

创建一个 buffer 指针视图仍然很有用,因为 是一个集合,有一个count 属性并且可以枚举:

let buffer = UnsafeMutableBufferPointer(start: pointer, count: 64)

for byte in buffer 
    // ...

但这与内存的初始化方式无关。

【讨论】:

没有回答问题... @StackUnderflow:问题是 “这是正确的方法吗?” 我用 “它是正确的” 来回答——然后是一个更简单的解决方案。请让我知道您对此有什么不清楚的地方。 编译时警告仍然存在。 @StackUnderflow:这很奇怪。我刚刚仔细检查了 Xcode 9.2 (Swift 4) 和 Xcode 9.3 beta 3 (Swift 4.1) 上面的代码编译时没有警告。 – 你在哪一行得到什么确切的警告?

以上是关于在 Swift 3.1 中,不推荐使用 UnsafeMutablePointer.initialize(from:)的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS Swift 3中加密AES 256 CBC,如laravel encrypt()方法

在 Swift 3.1 中使用啥来代替 NSEntityDescription

在 Swift 3.1 中使用 DateFormatter 正确构建 dateFormat 以解析时间

SwiftyJson 无法导入在 3.0.2 中使用 Carthage 编译的 Swift 3.1 模块中

在 Swift 3.1 中为 UIView 子类设置默认外观而不覆盖 initialize()

Swift 3.1 中的 CocoaTouch 类