在Swift 5中将void *参数传递给c函数时,不推荐使用'withUnsafeBytes'警告

Bri*_*ice 3 c unsafe-pointers swift

我有一个使用外部提供的C库快速解析FIT文件的库。解析函数将a作为参数void * data。为了调用该函数,我使用转换数据data.withUnsafeBytes( { (ptr: UnsafePointer<UInt8>) in ...}以建立c函数的参数,并且可以正常工作。

将Xcode升级到Swift 5之后,我现在收到了已弃用的警告

不建议使用“ withUnsafeBytes”:请withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R改用

我无法解决如何修复代码以删除不推荐使用的警告。代码运行正常,并且没有迅速发出警告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 )
})
Run Code Online (Sandbox Code Playgroud)

并举例说明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;
}
Run Code Online (Sandbox Code Playgroud)

我在这里用上述代码保存了一个小仓库,网址为https://github.com/roznet/swift2c,解析文件的完整项目在这里https://github.com/roznet/fit-sdk-swift

Mar*_*n R 6

您必须将闭包参数更改为UnsafeRawBufferPointer,然后采用它baseAdress(这是C UnsafeRawPointer?的Swift等效项void *):

data.withUnsafeBytes( { (ptr : UnsafeRawBufferPointer) in
    let value = readFITfile(ptr.baseAddress)
    // ...
})
Run Code Online (Sandbox Code Playgroud)

Swift编译器还可以自动推断闭包参数类型:

data.withUnsafeBytes( { ptr in
    let value = readFITfile(ptr.baseAddress)
    // ...
})
Run Code Online (Sandbox Code Playgroud)

有关此问题的更多信息,请参见Swift论坛中的withUnsafeBytes Data API混淆