2016-11-12 4 views
0

Ich habe eine unsigned char Array in. H-Datei. und ich habe auch eine Funktion, die unsigned Char-Array als Eingabe nimmt. Wenn ich versuche, diese Funktion in swift aufzurufen, wird sie UnsafeMutablePointer<UInt8>. Also, automatische Ziel-c zu schnellen Konverter denkt unsigned char sollte als UnsafeMutablePointer<UInt8> konvertiert werden. Aber ich kann meine Variable nicht direkt an diese Funktion übergeben. Weil ich bekomme,Konvertieren unsinged Char-Array von Objective-C zu unsafeMutablePointer <UInt8> Swift

Cannot convert value of type '(UInt8, UInt8, UInt8, UInt8, UInt8)' to expected argument type 'UnsafeMutablePointer<UInt8>!' 

Länge dieses Array ist statisch. Also, ich kann

let key = UnsafeMutablePointer<UInt8>.allocate(capacity: 64); 

und erstellen kann ich auch Wert erhalten, indem KEY.0, KEY.1 ... etc. Also, alles was ich brauche ist ein zu schaffen für Schleifenwert von KEY zu lesen und weist es key

for index in 1...64 { 
    key[index] = KEY[index]; 
} 

aber gibt diese Übersetzungsfehler als:

Value of tuple type '(UInt8, UInt8, UInt8, UInt8, UInt8)' has no member 'index' 

so, erste Frage, wie ich jeden Wert vonbekommennach Index. Zweitens ist es eine einfachere Art und Weise eine unsigned char Array UnsafeMutablePointer<UInt8>

Antwort

1

AC Array

unsigned char ckey[64]; 

wird importiert als Tupel in Swift zu konvertieren:

public var ckey: (UInt8, ..., UInt8) 

und man kann nicht die Tupelelemente zugreifen durch Subskribierung mit einem Index. (Nun, Sie können bei der Verwendung).

jedoch:

  • Die Adresse eines C-Array ist das gleiche wie die Adresse des ersten Arrayelementes und
  • für Strukturen aus C eingeführt, Swift bewahrt das Speicherlayout.

Letzteres war confirmed by Apple engineer Joe Groff:

... Sie können die Struktur in C definiert verlassen und in Swift importieren. Swift respektiert das Layout von C.

Daher können Sie die Adresse des ersten Tupelelement zu die Funktion übergeben:

f(key: &ckey.0) 

Natürlich - wie in C - die Informationen über die Größe des Arrays verloren, so dass die Array sollte NUL-terminiert sein, oder f sollte wissen über die Array-Größe.Alternativ übergeben Sie die Größe als zusätzliches Argument an die Funktion:

foo(key: &ckey.0, length: MemoryLayout.size(ofValue: ckey)) 
Verwandte Themen