2014-09-07 10 views
8

Voglio ottenere la lunghezza di una matrice con "sizeof". Ho provato di tutto. Questo è il messaggio di errore: "[Int32] non è convertibile in T.Type"Uso rapido sizeof con Int32 Array

L'array deve essere Int32.

var testArray: [Int32] = [2000,400,5000,400] 
var arrayLength = sizeof(testArray) 

risposta

19

Si può ottenere il numero di elementi in una matrice semplice con

let count = testArray.count 

e il numero totale di byte dei suoi elementi con

var arrayLength = testArray.count * sizeof(Int32) 
// Swift 3: 
var arrayLength = testArray.count * MemoryLayout<Int32>.size 

sizeof viene utilizzato con tipi e sizeofValue con valori, quindi sia

var arrayLength = sizeof([Int32]) 
var arrayLength = sizeofValue(testArray) 

compila. Ma questo ti dà la dimensione del struct Array, non la dimensione dell'elemento di archiviazione.

+0

Ho bisogno della lunghezza della matrice in byte. Il tuo codice non viene compilato. – Darx

+0

@Darx: vedere la risposta aggiornata. –

+0

Grazie. Funziona e sono felice. Ho perso 2 ore ... ma comunque ora funziona. :) – Darx

1

In Xcode 8 con Swift 3 beta 6 non esiste alcuna funzione sizeof(). Ma se vuoi, puoi definirne uno per le tue esigenze. Le buone notizie sono che questa nuova funzione sizeof funziona come previsto con il tuo array.

let bb: UInt8 = 1 
let dd: Double = 1.23456 

func sizeof <T> (_ : T.Type) -> Int 
{ 
    return (MemoryLayout<T>.size) 
} 

func sizeof <T> (_ : T) -> Int 
{ 
    return (MemoryLayout<T>.size) 
} 

func sizeof <T> (_ value : [T]) -> Int 
{ 
    return (MemoryLayout<T>.size * value.count) 
} 

sizeof(UInt8.self) // 1 
sizeof(Bool.self) // 1 
sizeof(Double.self) // 8 
sizeof(dd)   // 8 
sizeof(bb)   // 1 

var testArray: [Int32] = [2000,400,5000,400] 
var arrayLength = sizeof(testArray) // 16 

avete bisogno di tutte le versioni della funzione sizeof, per ottenere la dimensione di una variabile e per ottenere la dimensione corretta di un tipo di dati e di un array.

Se si definisce solo la seconda funzione, quindi sizeof (UInt8.self) e sizeof (Bool.self) risulteranno in "8". Se definisci solo le prime due funzioni, sizeof (testArray) risulterà in "8".