9

我正在为我的 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是 avImage_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!)'.

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

只是一些可能有帮助的文档链接:

先感谢您!

4

2 回答 2

18

使用assumingMemoryBound(to:)

返回指向此指针引用的内存的类型化指针,假设内存已绑定到指定类型。

在你的情况下:

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

有关详细信息,请参阅UnsafeRawPointer 迁移

于 2018-05-02T11:09:17.760 回答
0

我曾经有同样的问题。

public func add(_ left: Image, right: Image) -> Image! {
let results = Image.init(rows: left.size.rows, columns: left.size.columns, pixelSize: left.pixelSize)
var leftOperand = Float(left.buffer.data)
var rightOperand = Float(right.buffer.data)
var destination = Float(results.buffer.data)
vDSP_vadd(&leftOperand, 1, &rightOperand, 1, &destination, 1, UInt(left.lengthOfBuffer))
return results
}
于 2018-05-02T13:35:54.547 回答