【问题标题】:How to pass swift String to c function in Swift 5如何在 Swift 5 中将 swift 字符串传递给 c 函数
【发布时间】:2020-01-04 08:14:33
【问题描述】:

我想将 swift String 传递给 swift 5 中的 c 函数。

快速输入字符串

var key = "zxcvbnmqwertyui"
var error = "noerror"

C 函数声明

extern KeyRef key(char* p0, char** p1);

swift中的C函数声明

public func key(_ p0: UnsafeMutablePointer<Int8>!, _ p1: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!) -> KeyRef

问题: 如何将 swift 字符串(即键和错误)传递给 c 函数(即键)?

【问题讨论】:

    标签: string function type-conversion swift5


    【解决方案1】:

    如何将 swift 字符串(即键和错误)传递给 c 函数(即键)?

    答案取决于函数如何处理其参数。

      1. 是否会修改其参数传递的内容?
      1. 是否需要为p1传递的地址预先分配区域?

    我假设,

      1. p0 否,p1 是。
      1. 没有

    在这种情况下,您最好将函数头更新为:

    extern KeyRef key(const char* p0, char** p1);
    

    导入到 Swift 中的是:

    public func key(_ p0: UnsafePointer<Int8>!, _ p1: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!) -> KeyRef!
    

    你可以这样称呼它:

    let p0 = "zxcvbnmqwertyui"
    var error: String? = nil
    var errorPtr: UnsafeMutablePointer<CChar>? = nil
    
    let keyRef = key(p0, &errorPtr)
    if let errorMsg = errorPtr {
        error = String(cString: errorMsg)
    }
    

    如果您无法触摸 C 函数标题并按原样使用它:

    extern KeyRef key(char* p0, char** p1);
    

    那么你可能需要更多:

    let p0 = "zxcvbnmqwertyui"
    var p0CStr = Array(p0.utf8CString)
    var error: String? = nil
    var errorPtr: UnsafeMutablePointer<CChar>? = nil
    
    let keyRef = key(&p0CStr, &errorPtr)
    if let errorMsg = errorPtr {
        error = String(cString: errorMsg)
    }
    

    如果我的假设与您的 C 函数的要求不匹配,则上面的代码将不起作用,您可能需要显示它的精确规范。

    【讨论】:

    • 感谢回复,只有 p1 值会被修改。 p0 将仅用于读取目的,它的值不会被修改。
    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多