我正在为我的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!)'.
我不知道我是否在这里忽略了一些非常简单的事情,但我还没有解决这个问题。但是,我正在寻找一种不需要使用循环手动复制每个元素的解决方案,因为这个函数在应用程序中经常被调用。
只是一些可能有用的文档链接:
提前谢谢!
答案 0 :(得分:5)
返回一个指向此指针引用的内存的类型指针,假设内存已绑定到指定的类型。
在你的情况下:
let leftOp = left.buffer.data.assumingMemoryBound(to: Float.self)
let rightOp = right.buffer.data.assumingMemoryBound(to: Float.self)
// ...
有关详细信息,请参阅UnsafeRawPointer Migration。
答案 1 :(得分: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
}