2017-01-03 6 views
1

passiert Ich bin mit C-Zeigern in Objective CWie die C-Zeiger in schnellen

Diese Funktion meiner C:

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

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

Es ist sehr einfach, die Zeiger in Objective C zu verwenden, aber wenn ich habe versucht, in swift es andere Konzepte für die Zeiger wie UnsafeMutablePointer, UnsafePointer usw.

Wie ich die gleiche C-Funktion in schnellen

können

ich habe versucht, es zu benutzen ist sho Flügel wie dieser

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

Können Sie Kerle bitte machen Sie mir die Verwendung von C-Pointer in schnellen

+0

Können Sie zeigen, was "ListReaders" tut, um zu sehen, ob es sinnvoll ist, 'CChar' und Zeiger zu verwenden? – shallowThought

+0

Welche Version von Swift? – ryantxr

+0

Swift 3 @ryantxr –

Antwort

1

Der Code Ihrer C-Funktion aufrufen, so sein sollte:

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

Einige Punkte:

  • In C/Objective-C, es gibt keine primitiven Optionals, also sollten Sie sie nicht verwenden, wenn Sie in Swift mit C/Objective-C-Funktionen arbeiten.

    CLong? ->CLong, CUnsignedLong? ->CUnsignedLong

    Sie können einige Fehler erhalten, wenn Sie einige Variablen von nicht-Optional Urtyp erklären, in solchen Fällen tun Optionals nicht verwenden, sondern sie nur Anfangswerte geben.

  • Wenn Sie benötigen ein Argument für UnsafeMutablePointer<AType> oder UnsafePointer<AType> passieren, Sie in der Regel eine Variable vom Typ AType deklarieren und als inout Argument übergeben (spezifiziert durch Präfix ‚&‘).

    Die Parametertypen Ihrer ListReaders wird UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>! und UnsafeMutablePointer<UInt>!, so dass Sie Variablen vom Typ deklarieren müssen UnsafeMutablePointer<Int8>? (== UnsafeMutablePointer<Int8>?) und UInt (== CUnsignedLong).

+0

Funktioniert gut ..... Vielen Dank –