Как получить размер байта для произвольного массива в Swift?

Я хотел бы использовать let rawDataFromArray = NSData(bytes: myArray, length: ???) , но не знаю, как получить длину байтов для моего массива. Вот несколько примеров того, что может быть для моего массива:

 let arr1 = [1, 2, 3] let arr2 = [1.0, 23556789000.0] let arr3 = ["hello", "ok", "👍"] func arrayLength(myArray: Array) -> Int { var bytes = 0 for object in myArray { // not sure what to do here } return bytes } 

Я не уверен, что если пройти через каждый элемент массива (и в случае строк, проходящих через каждый символ, поскольку emojis может иметь больше байтов, представляющих их), это правильный способ сделать это.

Как получить размер байта для массива?
Может ли кто-нибудь сказать мне правильный способ сделать это?
Или, может быть, это просто NSData практика преобразования Array в NSData в Swift?

Я также видел преобразование Swift Array в NSData для постоянного хранения и преобразование массива байтов в NSData и Custom Array в NSData , но не смог понять, как получить размер байтов для такого произвольного массива.

One Solution collect form web for “Как получить размер байта для произвольного массива в Swift?”

Кажется, что возникает недоразумение: для каждого типа T все экземпляры T имеют одинаковый размер, который можно вычислить как sizeof(T) . В случае массивов может быть отступы между элементами массива, поэтому общий размер, необходимый для arr1 равен

 arr1.count * strideof(Int) 

(Сравните, например, Swift: как использовать sizeof? Для тонких различий между sizeof() и strideof() ).

Поэтому общая функция для создания NSData из массива будет

 extension Array { func asData() -> NSData { return self.withUnsafeBufferPointer({ NSData(bytes: $0.baseAddress, length: count * strideof(Element)) }) } } 

Использование withUnsafeBufferPointer() гарантирует, что массив использует непрерывное хранилище для своих элементов.

В случае «простых» типов, таких как Int и Float это дает ожидаемые результаты:

 let arr1 = [1, 2, 3] print(arr1.asData()) // <01000000 00000000 02000000 00000000 03000000 00000000> let arr2 = [1.0, 23556789000.0] print(arr2.asData()) // <00000000 0000f03f 0000204c 60f01542> 

Однако это бесполезно для массива строк:

 let arr3 = ["hello", "ok", "👍"] print(arr3.asData()) // <945b2900 01000000 05000000 00000000 00000000 00000000 9a5b2900 01000000 02000000 00000000 00000000 00000000 068d2900 01000000 02000000 00000080 00000000 00000000> 

потому что struct String содержит (скрытые / недокументированные) указатели на фактическое хранилище символов.

Одна из возможностей заключается в том, чтобы добавить каждую строку в виде строки UTF-8, завершенной NUL:

 let data3 = NSMutableData() arr3.forEach { string in string.withCString { data3.appendBytes($0, length: Int(strlen($0)) + 1) } } print(data3) // <68656c6c 6f006f6b 00f09f91 8d00> 

Кроме того, используйте NSKeyedArchiver как в потоках, на которые вы ссылались.

  • Медиа-обратные вызовы с встроенными видеороликами YouTube на iOS
  • Блокировать экран на устройстве программно
  • Не удается получить локальные данные (закрепленные объекты) из Parse Local Datastore
  • раскадровую сцену из таблицы и ее кнопку раскрытия информации
  • Локальная логика UICollectionView отсутствует в горизонтальном просмотре прокрутки
  • Добавить zxing в XCode 4
  • пользовательский контент uitableviewcell не анимируется при скрытии кнопки удаления
  • Как я могу определить, содержит ли UITableView определенный NSIndexPath?
  • Как экспортировать «жир» Cocoa Touch Framework (для симулятора и устройства)?
  • UIControl для создания всплывающего окна в приложении ios ipad
  • Настройка фонового изображения UITableViewCell
  • Interesting Posts

    Passbook не распознает iBeacon

    Миграция делегата UIWebView на метод делегирования WKWebView

    UIPickerView задает выбранную строку по заголовку

    Xcode 4 ярлык для переключения целевого назначения сборки

    Почему renderInContext намного медленнее, чем рисовать на экране?

    многостраничный запрос PUT с использованием AFNetworking

    Отключить WKWebView для открытия ссылок для перенаправления на приложения, установленные на моем iPhone

    Учебник по sskeychain и базовому auth для iPad-приложений?

    Ориентировочный индекс недели недели от NSDateComponents

    iOS: получить точный обратный геокодирование с помощью CLLocationManager?

    Переключение между представлениями сестры через UINavigationViewController

    AX ERROR при использовании Accessibility Inspector для приложения iOS.

    Управление ориентацией iPhone: что является самым эффективным способом?

    Ссылка на магазин приложений без перенаправления?

    Как сделать 2D-анимацию в Unity

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.