2017-01-03 61 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

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