我正在使用Accelerate库开发我的iOS应用程序。几年前,我用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
提前感谢您!