我正在为我的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
}
Image类具有一个buffer字段,它是vImage_Buffer,其定义如下:
open class Image {

open var buffer: vImage_Buffer

....}

问题:
调用buffer.data返回一种UnsafeMutableRawPointer!vDSP_add函数需要UnsafeMutablePointer<Float>作为其参数。我曾经能够立即将其转换为UnsafeMutablePointer<Float>对象。看起来现在不推荐使用初始化程序。因此,在像let leftOperand = UnsafeMutablePointer<Float>(left.buffer.data)这样的代码上,我得到了这个错误
Cannot invoke initializer for type 'UnsafeMutablePointer<Float>' with an argument list of type '(UnsafeMutableRawPointer!)'.

我不知道我是否在这里忽略了一些非常简单的问题,但是我仍然没有解决这个问题。但是,我正在寻找一种不需要使用循环手动复制每个元素的解决方案,因为此功能在应用程序中经常被调用。

只是一些文档链接可能会有所帮助:
  • https://developer.apple.com/documentation/accelerate/vimage_buffer
  • https://developer.apple.com/documentation/accelerate/1450275-vdsp_vsadd
  • https://developer.apple.com/documentation/swift/unsafemutablepointer#topics

  • 先感谢您!

    最佳答案

    使用 assumingMemoryBound(to:) :



    在您的情况下:

    let leftOp = left.buffer.data.assumingMemoryBound(to: Float.self)
    let rightOp = right.buffer.data.assumingMemoryBound(to: Float.self)
    // ...
    

    有关更多信息,请参见UnsafeRawPointer Migration

    关于ios - 如何转换UnsafeMutableRawPointer!到Swift 3.0或更高版本中的UnsafeMutablePointer <Float>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50133043/

    10-11 14:56