Как разыграть UnsafeMutableRawPointer! UnsafeMutablePointer <Float>в Swift 3.0 или 4.0? - PullRequest
0 голосов
/ 02 мая 2018

Я работаю с библиотекой 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!)'.

Я не знаю, пропускаю ли я что-то очень простое здесь, но я все еще не исправил это. Но я ищу решение, которое не требует ручного копирования каждого элемента с использованием цикла, так как эта функция вызывается в приложении довольно часто.

Только некоторые ссылки на документацию, которые могут помочь:

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Раньше у меня была такая же проблема.

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
}
0 голосов
/ 02 мая 2018

Использование assumingMemoryBound(to:):

Возвращает типизированный указатель на память, на которую ссылается этот указатель, при условии, что память уже связана с указанным типом.

В вашем случае:

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

См. UnsafeRawPointer Migration для получения дополнительной информации.

...