2015-06-11 11 views

risposta

2

Secondo un message in the [swift-evolution] mailing list by Joe Groff, si può semplicemente avvolgere la variabile in un array quando passa il puntatore a un'altra funzione. Questo metodo crea una matrice temporanea con una copia del valore nominale e funziona anche in Swift 2.

let number : Int = 42 
my_c_function([number]) 

In Swift 3, è possibile costruire un UnsafePointer direttamente. Tuttavia, è necessario assicurarsi che il ciclo di vita dell'array corrisponda a quello dello UnsafePointer. Altrimenti, la matrice e il valore copiato potrebbero essere sovrascritti.

let number : Int = 42 
// Store the "temporary" array in a variable to ensure it is not overwritten. 
let array = [number] 
var pointer = UnsafePointer(array) 

// Perform operations using the pointer. 
+0

Grazie, Andreas, vedrò questo non appena torno a casa !!! –

+0

Non sembra funzionare, ho paura ... Qualche idea? https://iswift.org/playground?HluN5e –

+0

Ah, sembra che si tratti di un problema di durata dell'oggetto. https://iswift.org/playground?C3hojU –

-1

È possibile utilizzare con UnsafePointer.

var number : Int = 42 
withUnsafePointer(to: &number) { (pointer: UnsafePointer<Int>) in 
    // use pointer inside this block 
    pointer.pointee 
} 

In alternativa, è possibile utilizzare il "$ 0" argomento scorciatoia per accedere al puntatore all'interno del blocco.

var number : Int = 42 
withUnsafePointer(to: &number) { 
    // use pointer inside this block 
    $0.pointee 
} 

Qui ci sono alcune buone note sull'utilizzo UnsafePointer: https://developer.apple.com/reference/swift/unsafepointer

+0

Sfortunatamente, questo non funziona per valori immutabili. –

+0

Giusto, ma presumo che stia usando "numero" per un valore inout in una chiamata di funzione. In tal caso, perché vorrebbe che fosse una "let"? Scommetto che è stato fatto un "let" invece di "var" per errore. –

Problemi correlati