Non penso che sia facilmente possibile. Allo stesso modo in cui non è possibile utilizzare gli array in stile C per i parametri che funzionano con un NSArray
.
Tutti i array C in Swift sono rappresentati da un UnsafePointer
, ad es. UnsafePointer<Float>
. Swift in realtà non sa che i dati sono una matrice. Se vuoi convertirli in un array Swift, avrai creato un nuovo oggetto e copieresti gli elementi uno per uno.
let array: Array<Float> = [10.0, 50.0, 40.0]
// I am not sure if alloc(array.count) or alloc(array.count * sizeof(Float))
var cArray: UnsafePointer<Float> = UnsafePointer<Float>.alloc(array.count)
cArray.initializeFrom(array)
cArray.dealloc(array.count)
Modifica
appena trovato una soluzione migliore, questo potrebbe effettivamente evitare di copiare.
let array: Array<Float> = [10.0, 50.0, 40.0]
// .withUnsafePointerToElements in Swift 2.x
array.withUnsafeBufferPointer() { (cArray: UnsafePointer<Float>) ->() in
// do something with the C array
}
Sicuramente la matrice con m pericoloso puntatore ust copiare il contenuto, in quanto non sa quanto a lungo rimarrà assegnato? – jhabbott
@jhabbott Ecco perché è "non sicuro" :). A seconda della rappresentazione interna di Array <> potrebbe essere necessario eseguire una copia in un'area di memoria contigua se non esiste già in uno, ma questo è probabilmente ragionevolmente improbabile/raro nella pratica. – Ephemera
Sembra che '' 'withUnsafePointerToElements''' sia stato rimosso: https://developer.apple.com/library/mac/releasenotes/General/APIDiffsMacOSX10_10_3/modules/Swift.html – marchinram