2014-09-07 3 views
8

Я хочу получить длину массива с размером «sizeof». Я все пробовал. Это сообщение об ошибке: «[Int32] не конвертируется в T.Type«Быстрое использование sizeof с Int32 Array

Массив должен быть Int32.

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

ответ

19

Вы можете получить количество элементов в массиве просто с

let count = testArray.count 

и общее число байтов его элементов с

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

sizeof используется с типы и sizeofValue со значениями, поэтому оба

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

будет компиляция. Но это дает вам размер struct Array, а не размер хранения элемента.

+0

Мне нужна длина массива в байтах. Ваш код не компилируется. – Darx

+0

@Darx: См. Обновленный ответ. –

+0

Спасибо. Работает, и я счастлив. Отработано 2 часа ... но в любом случае теперь это работает. :) – Darx

1

В Xcode 8 с Swift 3 beta 6 нет функции sizeof(). Но если вы хотите, вы можете определить его для своих нужд. Хорошей новостью является то, что эта новая функция sizeof работает так, как ожидалось, с вашим массивом.

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 

Вам нужны все версии функции SizeOf, чтобы получить размер переменной и, чтобы получить правильный размер типа данных и массива.

Если вы определяете только вторую функцию, то sizeof (UInt8.self) и sizeof (Bool.self) приведет к «8». Если вы определяете только первые две функции, то sizeof (testArray) приведет к «8».

Смежные вопросы