2017-01-03 63 views
1

我正在使用C指针的目标C如何通过C指针的迅速

这是我的C函数:

long ListReaders(
__out char** szReadersList, 
__out unsigned long* pulListLen){ 
} 

long Result; 
char* pszReadersList; 
unsigned long pulListLen; 
Result=ListReaders(&pszReadersList, & pulListLen); 

这是非常容易使用的目标C的指针,但是当我迅速有其他概念受审指针像UnsafeMutablePointerUnsafePointer

我如何可以使用快捷

相同的C函数我试图使用它是笑翼这样

var Result :CLong? 
var pszReadersList :CChar? 
var pulListLen: CUnsignedLong? 
Result=ListReaders(szReadersList:UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!>, pulListLen: UnsafeMutablePointer<UInt>!UnsafeMutablePointer<UInt>!>) 

你们可以请建议我C指针的迅速

+0

你可以显示'ListReaders'的作用,看看它是否合理使用'CChar'和指针? – shallowThought

+0

什么版本的Swift? – ryantxr

+0

Swift 3 @ryantxr –

回答

1

的代码使用打电话给你的C函数应该是这样的:

var result: CLong = 0 
    var pszReadersList: UnsafeMutablePointer<CChar>? = nil 
    var pulListLen: CUnsignedLong = 0 
    result = ListReaders(&pszReadersList, &pulListLen) 

一些要点:

  • 在C/Objective-C中,没有原始的可选项,所以在使用Swift中的C/Objective-C函数时不应该使用它们。

    CLong? - >CLongCUnsignedLong? - >CUnsignedLong

    当你声明的非可选的原始类型的一些变量,在这种情况下,不使用选配,但只是给他们的初始值,你可能会得到一些错误。

  • 当需要将参数传递给UnsafeMutablePointer<AType>UnsafePointer<AType>,通常声明AType类型的变量,并传递作为INOUT参数(由前缀“&”指定)。

    参数类型的你ListReaders变得UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!UnsafeMutablePointer<UInt>!,所以你需要声明UnsafeMutablePointer<Int8>?类型的变量(== UnsafeMutablePointer<Int8>?)和UInt(== CUnsignedLong)。

+0

工作正常.....非常感谢 –