如何转换 UnsafeMutableRawPointer!到 Swift 3.0 或更新版本中的 UnsafeMutablePointer<Float>?
How to cast UnsafeMutableRawPointer! to UnsafeMutablePointer<Float> in Swift 3.0 or newer?
我正在为我的 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
}
class Image
有一个字段 buffer
是一个 vImage_Buffer
并且是这样定义的,
open class Image {
open var buffer: vImage_Buffer
....}
问题:
调用 buffer.data
returns 类型 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
提前致谢!
Returns a typed pointer to the memory referenced by this pointer, assuming that the memory is already bound to the specified type.
你的情况:
let leftOp = left.buffer.data.assumingMemoryBound(to: Float.self)
let rightOp = right.buffer.data.assumingMemoryBound(to: Float.self)
// ...
有关详细信息,请参阅 UnsafeRawPointer Migration。
我以前也遇到过同样的问题
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
}
我正在为我的 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
}
class Image
有一个字段 buffer
是一个 vImage_Buffer
并且是这样定义的,
open class Image {
open var buffer: vImage_Buffer
....}
问题:
调用 buffer.data
returns 类型 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
提前致谢!
Returns a typed pointer to the memory referenced by this pointer, assuming that the memory is already bound to the specified type.
你的情况:
let leftOp = left.buffer.data.assumingMemoryBound(to: Float.self)
let rightOp = right.buffer.data.assumingMemoryBound(to: Float.self)
// ...
有关详细信息,请参阅 UnsafeRawPointer Migration。
我以前也遇到过同样的问题
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
}