从Swift调用C函数

3

我是一位帮助翻译文本的助手。

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

这个C函数是:

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

主要问题在于 pszFieldName, pnWidthpnDecimals 输入输出参数。我尝试过做如下处理:
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>)'

任何想法?
3个回答

2
UnsafeMutablePointer<Int8>, UnsafeMutablePointer<Int32>, UnsafeMutablePointer<Int32>

您需要将变量转换为方法签名所需的适当类型。
C语法:
  • const Type *
  • Type *
Swift语法:
  • UnsafePointer
  • UnsafeMutablePointer
这在苹果的《使用 Swift 与 Cocoa 和 Objective-C》参考文档中有介绍,可在此处查看

0

要从字符串创建一个 UnsafeMutablePointer<Int8>,请使用以下代码:

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

在您的代码示例中,cString 是一个 UnsafePointer<Int8>不是 UnsafeMutablePointer<Int8> - Mecki

0

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

const Type * -----> UnsafePointer

Type * -----> UnsafeMutablePointer

输入的数量和类型应该相同


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接