2014-09-07 3 views
8

Ich möchte die Länge eines Arrays mit "sizeof" erhalten. Ich habe alles versucht. Dies ist die Fehlermeldung: "[Int32] kann nicht in T.Type konvertiert werden"Schnelle Verwendung sizeof mit Int32 Array

Das Array muss Int32 sein.

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

Antwort

19

Sie können die Anzahl der Elemente in einem Array bekommen einfach mit

let count = testArray.count 

und die Gesamtzahl der Bytes seiner Elemente mit

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

sizeof mit verwendet wird, Typen und sizeofValue mit Werten, also sowohl

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

würde kompilieren. Aber das gibt Ihnen die Größe der struct Array, nicht die Größe des Elementspeichers.

+0

Ich brauche die Array-Länge in Bytes. Dein Code wird nicht kompiliert. – Darx

+0

@Darx: Siehe aktualisierte Antwort. –

+0

Danke. Funktioniert und ich bin glücklich. 2 Stunden verschwendet ... aber sowieso funktioniert es jetzt. :) – Darx

1

In Xcode 8 mit Swift 3 Beta 6 gibt es keine Funktion sizeof(). Aber wenn Sie möchten, können Sie eine für Ihre Bedürfnisse definieren. Die gute Nachricht ist, dass diese neue sizeof-Funktion wie erwartet mit Ihrem Array funktioniert.

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 

Sie müssen alle Versionen der sizeof-Funktion, um die Größe einer Variablen zu erhalten und die richtige Größe eines Datentyps und eines Arrays zu erhalten.

Wenn Sie nur die zweite Funktion definieren, dann ergeben sizeof (UInt8.self) und sizeof (Bool.self) "8". Wenn Sie nur die ersten beiden Funktionen definieren, ergibt sizeof (testArray) "8".