2016-06-29 26 views
12

ho cercato di eseguire il codice di seguito in rapida 3Swift 3 cambi per il metodo getBytes

var values = [UInt8](count:data!.length, repeatedValue:0) 
data!.getBytes(&values, length:data!.length) 

in cui i dati sono tipo di dati 'Dati' (NSData è il cambiamento di 'dati' di cui alla rapida 3 linee guida)

Non riesco a eseguire il codice sopra in Swift 3. Il compilatore dà errore che "Il valore dell'argomento ripetuto deve precedere l'argomento". La stessa linea di codice funzionava in Swift 2.2

Quale sarà la soluzione?

+0

Sebbene la domanda differisca leggermente, la risposta dovrebbe essere la stessa: http://stackoverflow.com/questions/38090320/writing-data-to-an-nsoutputstream-in-swift-3 – Desdenova

risposta

15

significa che gli argomenti ordine è stato invertito a Swift 3.

Per NSData:

var values = [UInt8](repeating:0, count:data!.length) 
data.getBytes(&values, length: data!.length) 

per dati:

var values = [UInt8](repeating:0, count:data!.count) 
data.copyBytes(to: &values, count: data!.count) 
+1

Questo era per un versione iniziale di Swift 3. Per il corrente Swift 3 e per Swift 4 dovresti usare la risposta di @ svd. – Moritz

26

Per Swift3 basta usare seguente:

let array = [UInt8](yourDataObject) 

That ' s tutti, gente!)

+0

Come si usa questo? Sto cercando di convertire il seguente da Objective-C: int16_t \t valore \t = 0; Risultato CGFloat = NAN; if (tempCharacteristic) { [[tempCharacteristic value] getBytes: & value length: sizeof (valore)]; risultato = (CGFloat) valore/10.0f; } // tempCharacteristic è un carattere CBC – Surz

+0

Ho paura ma per ottenere il risultato desiderato è necessario fare diversi passaggi. Sfortunatamente non ho molta esperienza con CB ma, come vedo, è necessario il valore Int16 e dividerlo per ottenere Float. Dal mio punto di vista si può raggiungere questo seguendo: let bytes = [UInt8] (tempCharacteristic.value); let pointer = UnsafePointer (byte); let fPointer = pointer.withMemoryRebound (a: Int16.self, capacità: 2) { return $ 0 }; let value = Int16 (fPointer.pointee); Spero che questo aiuti. (Ovviamente rimuovi tutti i punti e virgola;)) – sVd

+0

Grazie mille per il tuo puntatore, @sVd. Sto ancora avendo problemi a convertire lo snippet - ti dispiacerebbe controllare la mia domanda? https://stackoverflow.com/questions/45287488/trouble-converting-nsdata-objective-c-code-to-swift – Surz