2016-05-15 30 views
5

Sto lavorando con una libreria C esterna a Swift per OS X. ottengo un cda valore, che viene definito in C come double* (è un puntatore a un doppio array).Non può convertire il valore di tipo 'UnsafePointer <Double>' al tipo di argomento previsto 'UnsafePointer <_>'

Quando si importa in Swift, riconosce il tipo come UnsafeMutablePointer. Sto cercando di convertire questo puntatore e il conteggio in un doppio array. Ecco il codice che sto usando (assumere arrlen è il corretto conteggio della matrice):

let doublearrptr = UnsafePointer<Double>(cda) 
let xptarr = UnsafeBufferPointer<Double>(start: doublearrptr, count:arrlen) 

Tuttavia, quando si compila questo frammento di codice, ottengo l'errore:

Cannot convert value of type 'UnsafePointer<Double>' to expected argument type 'UnsafePointer<_>' 

Sono relativamente nuovo a Swift, ma sono abbastanza sicuro di non poterlo convertire in UnsafePointer<_>. Ho provato a convertire in UnsafePointer<Void>, ma questo ha lo stesso errore. Swift riconosce che cda è un UnsafeMutablePointer<Double>.

+0

Quando si dice "riconosce il tipo come UnsafeMutablePointer", si intende che lo riconosce come 'UnsafeMutablePointer '? – paulvs

+0

Sì, mi dispiace. Riconosce il doppio. – Laxsnor

+0

Puoi isolare e inviare codice che non dipende dalla libreria? (ad esempio, dichiarare un doppio array C e tentare di convertirlo in un array 'Swift ') e mostrare quale riga sta producendo l'errore? Il codice che hai postato sembra OK. – paulvs

risposta

3

Quindi, sono stato in grado di risolverlo, anche se in modo indiretto.

ho creato una nuova funzione di conversione e lo ha utilizzato:

func convertArr<T>(count: Int, data: UnsafePointer<T>) -> [T] { 

    let buffer = UnsafeBufferPointer(start: data, count: count) 
    return Array(buffer) 
} 
... 
let doublearrptr = UnsafePointer<Double>(cda) 
let arr = convertArr(Int(shobjarrlen), data: doublearrptr) 

Per qualche ragione questo funziona, ma non la sintassi originale ...

Sono ancora aperte le risposte che ottengono da perché la mia sintassi originale non ha funzionato.

+0

Wow, buona scoperta. Completamente d'accordo che il tuo codice originale avrebbe dovuto andare bene. Stavo avendo lo stesso problema - per me questo sembra molto simile a un bug in Swift. – HughHughTeotl

Problemi correlati