Как получить размер байта для произвольного массива в 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 как в потоках, на которые вы ссылались.

  • iOS: приложение «Запуск сообщений» с несколькими получателями
  • Высота UITabBar в iOS 5
  • Как использовать GCD dispatch_barrier_async в iOS (кажется, выполняется до и после других блоков)
  • 'required' initializer 'init (coder :)' должен быть предоставлен подклассом UIViewController
  • Структура импорта для всего проекта в одном месте в Свифт?
  • Как вывести сообщение «Сотовые данные отключено»?
  • Как поймать какое-либо событие касания на UIButton, который является подвидью UITableView
  • Сделать блокировку UIAlertView
  • Бесплатный компонент отображения для IOS
  • iPhone App: как реализовать Google Places Api
  • Каковы общие случаи использования __IPHONE_OS_VERSION_MAX_ALLOWED?
  • Interesting Posts

    UIImageView для показа хода загрузки приложения

    Разрешения на фото iOS для повторного запроса

    Отключите клавиатуру, когда нажимаете на UITextField с пользовательским inputView

    HTML 5 + iOS – создание гибридных приложений

    Аналитика ориентации устройства

    Обновление элементов пользовательского интерфейса в фоновом потоке перед добавлением в представление

    Выбор UITableViewCell над UITextView

    Матричное умножение и обратные задачи с ускорением

    Как синхронизировать / проверять повторяющиеся подписки в приложении с помощью веб-сервера (кросс-платформенная подписка)

    Что происходит с вызовами Console.WriteLine в выпусках Xamarin.iOS?

    Как определить, имеет ли устройство iOS сотовую радиостанцию?

    Ошибка при построении платформы iOS с помощью кордовы-cli

    UITapGestureRecognizer для определения того, какой UIView был использован на моем экране

    Можно ли непрерывно отслеживать область MKMapView при прокрутке / масштабировании?

    получить json-объект, а затем назначить для просмотра

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