У меня есть библиотека, которая разбирает файл FIT в swift, используя внешнюю библиотеку c. Функция синтаксического анализа принимает в качестве аргумента void * data
.
Чтобы вызвать функцию, я конвертировал данные, используя data.withUnsafeBytes( { (ptr: UnsafePointer<UInt8>) in ...}
для построения аргумента функции c, и она работала нормально.
После обновления Xcode до swift 5 теперь я получаю устаревшее предупреждение
'withUnsafeBytes' устарело: используйте withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
вместо
Я не мог понять, как исправить код, чтобы удалить устаревшее предупреждение. Код работал нормально и без предупреждения в swift 4
Я пытался изменить аргумент в замыкании, чтобы взять UnsafeRawBufferPointer
вместо UnsafePointer, но это привело к ошибке при вызове функции: Cannot convert 'UnsafeRawBufferPointer' to expected argument type 'UnsafeRawPointer?'
Это небольшой файл swift, показывающий проблему:
import Foundation
// Create sample data (Typically would be read from a file
let data = Data(repeating: 1, count: 10)
data.withUnsafeBytes( { (ptr : UnsafePointer<UInt8>) in
// call the c function with the void* argument
let value = readFITfile(ptr)
print( value )
})
И пример c функцией
unsigned readFITfile(const void * data){
//Silly example to show it works, just returning the value of pointer as int
//Typically would parse the data and return a structure
return (unsigned)data;
}
Я сохранил небольшой репозиторий с указанным выше кодом здесь https://github.com/roznet/swift2c, а полномасштабный проект с разбором файла находится здесь https://github.com/roznet/fit-sdk-swift