2014-09-07 8 views
8

Chcę uzyskać długość tablicy z "sizeof". Próbowałem wszystkiego. Jest to komunikat o błędzie: "[Int32] nie można zmienić na T.Type"Swift use sizeof z Int32 Array

Tablica musi mieć wartość Int32.

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

Odpowiedz

19

można uzyskać liczbę elementów w tablicy po prostu z

let count = testArray.count 

i ogólnej liczbie bajtów jej elementów z

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

sizeof jest używany typy i sizeofValue z wartościami, więc zarówno

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

będzie skompilować. Ale to daje rozmiar struct Array, a nie rozmiar pamięci elementu.

+0

Potrzebuję długość Array w bajtach. Twój kod nie kompiluje się. – Darx

+0

@Darx: Zobacz zaktualizowaną odpowiedź. –

+0

Dziękuję. Działa i jestem szczęśliwy. Zmarnowane 2 godziny ... ale tak czy inaczej teraz działa. :) – Darx

1

W Xcode 8 z Swift 3 beta 6 nie ma funkcji sizeof(). Ale jeśli chcesz, możesz zdefiniować dla swoich potrzeb. Dobrą wiadomością jest to, że ta nowa funkcja sizeof działa zgodnie z oczekiwaniami z twoją tablicą.

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 

Trzeba wszystkie wersje funkcji sizeof, aby uzyskać rozmiaru zmiennej i, aby uzyskać prawidłowy rozmiar typu danych i tablicy.

Jeśli zdefiniujesz tylko drugą funkcję, sizeof (UInt8.self) i sizeof (Bool.self) dadzą wynik "8". Jeśli zdefiniujesz tylko pierwsze dwie funkcje, sizeof (testArray) spowoduje "8".