【问题标题】:Calling C function from Swift从 Swift 调用 C 函数
【发布时间】:2015-06-08 10:21:10
【问题描述】:

我正在尝试从 Swift 调用 C 函数,但我不知道如何定义变量以传递参数。

函数c是:

DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals );

主要问题是pszFieldNamepnWidthpnDecimals inout参数。我试过了​​​​:

var dbf:DBFHandle = DBFOpen(pszPath, "rb")
var fName:[CChar] = [] 
var fieldWidth:Int32 = 0
let fieldDecimals:Int32 = 0

let fieldInfo:DBFFieldType = DBFGetFieldInfo(dbf, i, fName, &fieldWidth, &fieldDecimals)

但它给了我一个错误

Cannot invoke 'DBFGetFieldInfo' with an argument list of type '(DBFHandle, Int32, [CChar], inout Int32, inout Int32)'
Expected an argument list of type '(DBFHandle, Int32, UnsafeMutablePointer<Int8>, UnsafeMutablePointer<Int32>, UnsafeMutablePointer<Int32>)'

有什么想法吗?

【问题讨论】:

    标签: ios objective-c c swift pointers


    【解决方案1】:
    UnsafeMutablePointer<Int8>, UnsafeMutablePointer<Int32>, UnsafeMutablePointer<Int32>
    

    您需要将变量转换为方法签名所需的适当类型。

    C 语法:

    • 常量类型 *
    • 输入 *

    Swift 语法:

    • 不安全指针
    • UnsafeMutablePointer

    Apple 在他们的 Using Swift with Cocoa and Objective-C 参考 located here 中对此进行了介绍。

    【讨论】:

      【解决方案2】:

      C 语法 -----> Swift 语法

      const Type * -----> UnsafePointer

      输入 * -----> UnsafeMutablePointer

      输入的数量和类型要一致

      【讨论】:

        【解决方案3】:

        要从字符串创建UnsafeMutablePointer&lt;Int8&gt;,请使用:

        String(count: 10, repeatedValue: Character("\0")).withCString( { cString in
            println()
            // Call your function here with cString
        })
        

        【讨论】:

        • 在您的代码示例中,cStringUnsafePointer&lt;Int8&gt;不是 UnsafeMutablePointer&lt;Int8&gt;
        猜你喜欢
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-10
        相关资源
        最近更新 更多