【问题标题】:C const void * param from Swift: Data?.withUnsafeBytes and UnsafeRawPointer来自 Swift 的 C const void * 参数:Data?.withUnsafeBytes 和 UnsafeRawPointer
【发布时间】:2017-06-29 20:38:43
【问题描述】:

我正在尝试将 Data? 中包含的字节传递给 C 函数。 C 函数声明如下:

void func(const void *buffer);

我的 Swift 看起来像:

myData?.withUnsafeBytes { (buffer: UnsafeRawPointer) in
    func(buffer)
}

但是,这会导致错误:

Cannot convert value of type '()' to closure result type '_'

如果我将UnsafeRawPointer 更改为UnsafePointer<Void>,则代码会构建,但我会收到警告:

UnsafePointer<Void> has been replaced by UnsafeRawPointer

解决这个问题的正确方法是什么?

【问题讨论】:

    标签: c swift unsafe-pointers


    【解决方案1】:

    因为您可以将 any 数据指针传递给 C 函数 void *参数,问题可以解决

    myData?.withUnsafeBytes { (buffer: UnsafePointer<Int8>)  in
        myfunc(buffer)
    }
    

    或者,您可以省略类型注释并让 编译器自动推断类型:

    myData?.withUnsafeBytes { (buffer)  in
        myfunc(buffer)
    }
    

    myData?.withUnsafeBytes {
        myfunc($0)
    }
    

    有趣的是,类型被推断为UnsafePointer&lt;Void&gt;,没有 任何警告。

    【讨论】:

    • 谢谢!这是有道理的,我应该自己尝试一下
    • @MartinR 恭喜获得 300k :)
    • @craig65535:有一个更简单的解决方案,请参阅更新。
    猜你喜欢
    • 2019-08-21
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多