小编Kee*_*.D.的帖子

如何投射UnsafeMutableRawPointer!到Swift 3.0或4.0中的UnsafeMutablePointer <Float>?

我正在为我的iOS应用程序使用Accelerate库。几年前,我在Swift 2.0中构建了这个应用程序,并且运行良好。现在,Swift已更新为3.0和4.0,我必须将大多数代码转换为当前语法。我已经运行了转换器,但是仍然有一些语法错误。这是我最难解决的问题。我似乎找不到一种相当简洁的方法来修复它。

我对图像进行了基本的算术运算。这是其中之一:

public func add(_ left: Image, right: Image) -> Image! {
    let results = Image.init(rows: left.size.rows, columns: left.size.columns, pixelSize: left.pixelSize)
    let leftOperand = UnsafeMutablePointer<Float>(left.buffer.data)
    let rightOperand = UnsafeMutablePointer<Float>(right.buffer.data)
    let destination = UnsafeMutablePointer<Float>(results.buffer.data)
    vDSP_vadd(leftOperand, 1, rightOperand, 1, destination, 1, UInt(left.lengthOfBuffer))
    return results
}
Run Code Online (Sandbox Code Playgroud)

该类Image的字段buffer为a vImage_Buffer,其定义如下:

open class Image {

open var buffer: vImage_Buffer

....}
Run Code Online (Sandbox Code Playgroud)

问题: 调用buffer.data返回的类型为UnsafeMutableRawPointer!。该vDSP_add功能需要UnsafeMutablePointer<Float>其参数。我曾经能够立即将其投射到UnsafeMutablePointer<Float>对象上。看起来现在不推荐使用初始化程序。因此,在类似的代码上let leftOperand = UnsafeMutablePointer<Float>(left.buffer.data),我得到了这个错误

Cannot invoke initializer …
Run Code Online (Sandbox Code Playgroud)

ios accelerate-framework swift vimage unsafemutablepointer

3
推荐指数
1
解决办法
1079
查看次数