Приборы и средства промышленной автоматизации
Наша компания —
Delta Electronics, IABG в России
продажа и сервис средств промышленной автоматизации
Подробнее
Компания Delta Electronics выпускает
с 1995 года и в настоящее время занимает 3-е место в мире по количеству производимых частотных приводов (более 3 млн.шт./год).
Подробнее
Единая среда разработки для проектов автоматизации
Единое инженерное программное обеспечение, заменяющее большинство имеющихся на данный момент программ и утилит для компонентов промышленной автоматизации Delta
Подробнее
Каталог продукции
Преобразователи частоты
Delta Electronics
Сервоприводы
Панели оператора
Delta Electronics
Программируемые контроллеры
Delta Electronics
Устройства плавного пуска
Системы ЧПУ
Delta Electronics
Техническое зрение
Delta Electronics
Модули рекуперации
Delta Electronics
Температурные контроллеры
Delta Electronics
Источники питания
Delta Electronics
Датчики
Delta Electronics
Оптические энкодеры
Delta Electronics
Коммуникационные модули
Delta Electronics
Коммутаторы Ethernet
Delta Electronics
Роботы-манипуляторы
Delta Electronics
Дроссели
Тормозные модули и резисторы
Приборы КИПиА
Fotek Controls
Среда разработки
Delta Electronics
Шкафы управления
25
Лет опыта
82
Региона России
900+
Клиентов
7500+
Успешных проектов
Мы — авторизованный дистрибьютер компаний: Delta Electronics Inc. (по бизнес группе Industrial Automation Business Unit (IABU), AuCom, Fotek Controls.
Дилер компаний: Elhand Transformatory и ряда других.
Наша компания предлагает комплексные программно-аппаратные решения для широкого спектра задач в промышленности и компоненты для промышленной автоматизации. Оказывает инжиниринговые услуги, услуги по гарантийному и постгарантийному сервисному обслуживанию.
Последние новости
Семинар «Сервоприводы Delta ASD: расширенные возможности управления движением»
20 января 2023 г.
1-2 февраля 2023 года состоится обучающий семинар (углубленный курс), в рамках которого слушатели ознакомятся с сервоприводами Delta семейства ASD, особенностями их применения и принципами выбора, встроенными в них функциями управления движением
Семинар «Программирование ПЛК Delta AS300 и создание проектов для панелей оператора Delta DOP-100»
19 января 2023 г.
30-31 января 2023 года состоится обучающий семинар, в рамках которого участники научатся создавать собственные проекты автоматизации на базе контроллера Delta AS300 и панели оператора Delta DOP-100
Практический семинар по системам ЧПУ Delta Electronics
13 января 2023 г.
18-19 января 2023 г. в рамках семинара участники ознакомятся с функциональностью систем ЧПУ Delta NC200/300/30E и областями их применения, научатся их конфигурировать для применения в новых и модернизируемых станках, а также создавать собственные пользовательские экраны и шаблоны обработки
С Новым 2023 Годом!
29 декабря 2022 г.
Наш коллектив от всего сердца поздравляет Вас наступающим Новым Годом!
Создание индивидуальных экранов в системах ЧПУ Delta29 декабря 2022 г.
Встроенный функционал систем ЧПУ Delta NC200/300/30E предоставляет возможность разработки собственных экранов и шаблонов обработки, а также настройки и управления всей электроавтоматикой станка
Виды сертификаций мотошлемов — обзор ECE, DOT, Snell, SHARP и FIM
Сертификация мотошлема, что мы об этом знаем? Если спросить обывателей, то ответы будут примерно такими:
— Это то, что подтверждает уровень безопасности шлема.
— Сертификация подскажет, какие нагрузки сможет выдержать мой шлем.
— Сертификация определяет, где и как я могу использовать свой шлем.
Ярлычок на шлеме сообщает, какому именно стандарту безопасности он соответствует — DOT, Snell, SHARP или ECE 22.05/ECE 22.06? При этом шлем может одновременно соответствовать нескольким стандартам, что определенно на руку владельцу.
Встречается мнение, что стоимость шлема зависит от того, какой сертификацией он обладает. Так ли это?
Что такое сертификация FIM и правда ли, что она может появиться на обычных мотошлемах?
Резюме:
Если коротко сравнивать наиболее распространенные сертификации, то все они проводят экспертизу на ударопрочность, истирание, посадку шлема на голове, надежность застежек, вытягивание ремней и их прочность, обзорность и:
- Тест на проникновение — DOT и Snell
- Тест на противостояние агрессивным химическим средам — Snell и ECE R22.05
- Легкость снятия шлема — Snell и ECE R22-05
- Тестирование подбородной дуги — Snell и ECE R22-05
Считается, что при силе удара в 200-250G человек получает тяжелые черепно-мозговые травмы, но при которых можно выжить.
Экспертиза учитывает возможные изменения при повышенных и пониженных температурах, поэтому во время тестов шлем изучают в разных условиях.
На просторах Америки наиболее распространены сертификации DOT и Snell. В Европейских странах используется ECE R22.05, который признается 47 странами. При этом DOT не противоречит стандарту ECE R22.05. Часто шлемы поставляемые в Европу из Америки имеют две сертификации, чтобы не нарушать законов о безопасности.
ECE 22.05/ ECE 22.06
В предыдущей статье мы подробно рассмотрели особенности этой сертификации и ее грядущего обновления. На данный момент ECE 22.05/ECE 22.06 является наиболее полной системой тестирования. Она объединяет многие приемы из других рейтингов, что выводит ее в топ среди прочих.
Важным моментом является тот факт, что шлемы получают сертификацию до выхода на рынок, а это значит, что покупая шлем с ярлычком ECE 22. 05, вы можете быть уверены — шлем уже проходил все необходимые экспертизы.
DOT
Американский стандарт безопасности для дорог общего пользования появился в далеком 1985 году. Это стандарт департамента транспорта, за которым следит Национальное Управление безопасности дорожного движения (NHTSA).
Производители сообщают контролирующим органам, что их шлем соответствует стандарту DOT. Если во время контрольной закупки и последующего теста выяснится, что некий шлем не проходит по показателям, то производителя ждут крупные штрафы и отзыв продукции. То есть если европейский стандарт тестирует шлемы перед выпуском, то DOT — стандарты, за которыми следят в первую очередь производители. Естественно, если у какого-либо производителя в партии находят бракованный шлем, такой же шлем из этой партии уже может быть продан. Вот что пугает в этой сертификации покупателей.
Информацию о тестах можно получить в открытом доступе на сайте Национального Управления безопасности дорожного движения США, которое публикует отчеты своих проверок.
Опасаться стоит только тем, чей шлем кроме DOT не имеет никакой другой сертификации, а производитель еще не заслужил честного имени.
Шлем проверяется на защиту от ударов путем падения с заданной точки высотой почти в два метра на круглую, а потом на плоскую наковальню. Силу удара фиксируют датчики. Оценивается насколько плотно сидит шлем после столкновения. Приверженцы DOT считают, что поглощение силы удара и рассеивание энергии важнее, чем сопротивление удару. В этом есть здравая логика.
Дополнительно существует тест на проникновение, когда шлем в прямом смысле слова – протыкают.
Snell
Частная некоммерческая организация Snell Memorial Foundation (SMF) разработала свои стандарты безопасности. Сертификация Snell — не обязательна, носит добровольный характер, но признается на международном уровне. Она была разработана и названа в честь мотогонщика Уильяма «Пита» Снелла, погибшего из-за травмы головы, потому что его шлем в 1956 году был далек от современных.
Тестирование начинается с проверки посадки шлема. Однако критерии не такие жесткие, как у ECE 22.05, но строже, чем DOT. На проворачивание теста нет, достаточно, чтобы шлем не снимался с манекена.
«Ударный» тест проверяет на запас прочности по средствам падения шлема с высоты на округлую и плоскую наковальню, имитирующие удары о разные поверхности. В том числе на прочность тестируется и подбородочная часть интегралов.
Хочу рассказать про один интересный момент в экспертизе, правда, он касается только профессиональных гоночных шлемов. Их тестируют на огнеупорность, проверяют при помощи пропанового пламени температурой около 790 градусов Цельсия.
SHARP
Safety Helmet Assessment and Rating Programme — британская система оценки, которая выставляет оценки по своему рейтингу. SHARP проверяет уже сертифицированные шлемы, а это значит, что экспертиза лишний раз подтверждает безопасность шлема. Как так вышло?
Когда Великобритания вошла в состав ЕС, она согласилась со стандартами ECE 22.05, которые действуют в странах Европы. Ранее британские шлемы оценивались рейтингом BSI.
Так появился новый рейтинг, но вопросов к нему много. Неожиданно, бюджетные шлемы получали пять звезд в результате тестирования в то время, как брендовые и профессиональные – только четыре или даже три. Основателей рейтинга даже обвиняли в маркетинговом ходе и неточности критериев.
Для тестирования делается контрольная закупка в обычных розничных магазинах. Шлемы проверяются на соответствующего размера болванке. Нужно заметить, что модель головы используется твердая, а не биометрическая, как планировалось изначально.
«Ударный» тест включает в себя удар плоской и угловатой поверхностью, имитирующей бордюрные камни. Удары наносятся на основные травмоопасные места с возрастающей силой. Дополнительно оценивается трение по абразивной поверхности.
Из-за тестирования бокового удара некоторые производители выпустили ряд шлемов с учетом требований SHARP. Из-за этого у таких моделей замечено ухудшение бокового обзора. К слову, это называют одной из причин, по которой бюджетные модели получали высокие оценки — более жесткие края в минус обзору. Кроме того, это тестирование не учитывает удар в подбородок.
От теста на проникновение они отказались, так как считают, что это не самая опасная причина травматизма.
Международная федерация мотоциклистов (FIM)
В 2019 году Международная федерация мотоциклистов — орган тестирующий экипировку для MotoGP, Moto2 и Moto3 — сообщила об увеличении стандартов безопасности. Кроме того, FIM потребовала, чтобы каждый шлем, который соответствует этим стандартам, был доступен для любого другого мотоциклиста на улицах города.
У FIM есть преимущество, которого нет у других сертификаций – реальный опыт мотогонок. Федерация с высоты своего опыта планирует установить планку выше существующих стандартов Snell, ECE и JIS (японский стандарт безопасности).
Да, здесь тоже будут учитываться лобовые и косые удары, истирание и устойчивость. Известно, что MIPS или EPS-вкладыши пока не являются обязательным пунктом для получения сертификации. Первым отличием станет тестирование на повышенных скоростях, на которых обычный мотоциклист в городе ездить будет вряд ли. Но кому от этого хуже?
Важное отличие, из-за которого все заинтересовались новым рейтингом – тестирование в зависимости от размера шлема. Это очень интересная тема для рассуждений, потому что разница в подходе у разных сертификаций заставляет специалистов серьезно спорить. Оценка влияния силы удара на мозг человека должна быть основана на тестировании в прямой зависимости от размера шлема и объема головы.
В сети встречаются споры, дескать, как при одинаковых условиях тестов не учитывается большая или меньшая площадь шлема… и дальше – расчеты, споры, пена у рта…
Пока речь идет о тестировании интегралов с застежкой D-кольцо. Отдельно планируется запустить тестирование шлемов, предназначенных для бездорожья. Но уже сейчас понятно, что цена за такой шлем для городского мотоциклиста будет серьезной.
Так влияет ли сертификация на цену шлема?
Давайте размышлять здраво. Цена шлема складывается из многих факторов, но основными всегда будут материалы и трудозатраты. Шлем с допуском от FIM стоит бешенных денег по меркам обычных гражданских водителей не потому, что его проверяла Международная федерация мотоциклистов, а потому что это шлем для профессиональных мотогонок. Шлем с сертификацией одного только DOT может быть бюджетнее, нежели DOT + ECE 22.05/ECE 22.06, а может и не быть.
Шлем из не особо первоклассных материалов тяжелее, менее комфортный, менее вентилируемый, но он все равно будет надежным как кирпич. Правда, аэродинамика тоже будет как у кирпича, скорее всего. Бюджетный шлем может пройти сертификацию ECE 22.05 и не стоить как космолет. Но будет ли в нем так же удобно, как в шлеме с той же сертификацией, но из других материалов — более легких? На стоимость шлема сказывается в том числе материал подкладки, множество плюшек, которые придумал производитель для комфорта.
На примере сертификации SHARP, которая выставила высокие оценки бюджетным шлемам, можно утверждать, что безопасный шлем может иметь разные ценовые категории. Это не сертификация делает шлем дорогим, а то, насколько безопасным и комфортным делает его производитель.
Codable и JSON в Swift (как это сделать) – AppyPie
By Abhinav Girdhar | Последнее обновление: 7 февраля 2023 г. 8:56 | 6 минут чтения
Вы можете использовать Codable в Swift для кодирования и декодирования пользовательских форматов данных, таких как JSON, в собственные объекты Swift. Невероятно легко сопоставить объекты Swift с данными JSON и наоборот, просто приняв протокол Codable.
Как прагматичный разработчик iOS, вы рано или поздно столкнетесь с JSON. Каждый веб-сервис, от Facebook до Foursquare, использует формат JSON для передачи данных в ваше приложение и из него. Как вы можете эффективно кодировать и декодировать эти данные JSON для объектов Swift?
В этом руководстве по разработке приложений вы узнаете, как работать с объектами JSON в Swift, используя протокол Codable. То, что вы узнаете, можно легко применить и к другим форматам данных. Мы займемся кодированием и декодированием с помощью JSONEncoder и JSONDecoder, и я покажу вам, как быть посредником между данными JSON и Swift.
Содержание- Начало работы: кодирование и декодирование
- Объяснение протокола Codable
- Работа с Codable
- Декодирование JSON в объекты Swift с помощью Codable
- Кодирование объектов Swift в виде JSON с помощью Codable
- Работа с вложенными массивами и Codable
- Дополнительная литература
Какую проблему на самом деле решает протокол Codable в Swift? Начнем с примера.
Представьте, что вы создаете приложение для рецептов. Приложение показывает различные рецепты в виде списка, включая ингредиенты, инструкции и основную информацию о еде.
Вы получаете данные для приложения из веб-службы и их облачного API. Этот API использует формат данных JSON. Каждый раз, когда вы запрашиваете рецепт у веб-сервиса, вы получаете обратно данные JSON.
Вот пример данных JSON для рецепта:
{
«имя»: «Спагетти болоньезе»,
«автор»: «Кулинарный уголок Рейндера»,
«url»: «https://cookingcorner.com/ спагетти-болоньезе»,
«выход»: 4,
«ингредиенты»: [«сыр», «любовь», «спагетти», «говядина», «помидоры», «чеснок»],
«инструкции»: «приготовить спагетти, пожарить говядину с чесноком, добавить помидоры, добавить любви, есть!»
}
Взгляните на структуру данных JSON.
Объекты JSON заключены в фигурные скобки { и }, а массивы заключены в квадратные скобки [ и ]. Имена свойств представляют собой строки, заключенные в кавычки «. Значения в JSON могут быть строками, числами (без кавычек), массивами или другими объектами. Вы также можете вкладывать данные, т. е. массивы в массивы, объекты в массивы и т. д., чтобы создать сложную иерархию данных.
JSON — это текстовый формат данных, используемый многими веб-службами, включая API-интерфейсы Twitter, Facebook, Foursquare и т. д. Если вы создаете приложения, использующие веб-ресурсы, вы столкнетесь с JSON.
Формат JSON превосходит распространенную альтернативу XML, поскольку он эффективен, легко анализируется и читается людьми. JSON — это согласованный формат для веб-сервисов, API и приложений. Он используется в Интернете, приложениях и онлайн-сервисах, потому что формат прост и гибок.
И у JSON есть одна превосходная возможность: вы можете кодировать любой формат данных в JSON и декодировать JSON обратно в любой формат данных. Именно этот процесс кодирования и декодирования делает JSON таким мощным.
Вы можете взять свои значения Swift String, Int, Double, URL, Date, Data, Array и Dictionary и закодировать их как JSON. Затем вы отправляете их веб-сервису, который декодирует значения в собственный формат, который он понимает. Точно так же веб-служба отправляет данные, закодированные как JSON, в ваше приложение, и вы декодируете данные в собственные типы, такие как String, Double и Array.
Когда ваше приложение с рецептами получает JSON (см. выше), его можно декодировать в структуру Swift, например эту:
struct Recipe {
var name: String
var author: String
var url: URL
var yield: Int
var ингредиенты: [String]
var инструкции: String
}
В Swift протокол Codable используется для перехода от объекта данных JSON к реальному классу или структуре Swift. Это называется декодированием, потому что данные JSON декодируются в формат, понятный Swift. Это также работает и по-другому: кодирование объектов Swift как JSON.
Протокол Codable в Swift на самом деле является псевдонимом протоколов Decodable и Encodable. Поскольку вы часто используете кодирование и декодирование вместе, вы используете протокол Codable, чтобы получить оба протокола за один раз.
Центральным элементом рабочего процесса кодирования/декодирования является протокол Swift Codable. Давайте узнаем, как это работает, дальше!
Не можете отличить «кодирование» от «декодирования»? Подумайте об этом так: мы конвертируем данные из «кода» и в него, например, в машине «Энигма» или в секретном шифровальном шифре. Кодирование означает преобразование данных в код; кодирование или «внутри/внутри кода». Декодирование означает преобразование кода в данные; декодирования или «кода от/от».
Использование JSON до Swift 4 было чем-то вроде PITA. Вам придется самостоятельно сериализовать JSON с помощью JSONSerialization, а затем привести каждое свойство JSON к правильному типу Swift.
Вот так:
let json = try? JSONSerialization.jsonObject(with: data, options: [])
если пусть recipe = json как? [Строка: Any] {
if let yield = recipe[“yield”] as? Int {
recipeObject.yield = yield
}
}
Приведенный выше фрагмент берет значение доходности только из JSON и передает его в Int. Это чрезвычайно многословно, и трудно правильно реагировать на возможные ошибки и несоответствия типов. Хотя это работает, это не идеально.
Библиотеки, такие как SwiftyJSON, значительно упрощают работу с JSON, но вам по-прежнему необходимо сопоставлять данные JSON с соответствующими объектами и свойствами Swift.
В Swift 4 и более поздних версиях вместо этого можно использовать протокол Codable. Ваша структура или класс Swift просто должны принять протокол Codable, и вы получите готовое кодирование и декодирование JSON бесплатно.
Протокол Codable представляет собой комбинацию двух протоколов, Decodable и Encodable. Оба протокола довольно минимальны; они определяют только функции init(from: Decoder) и encode(to: Encoder) соответственно. Другими словами, эти функции означают, что для того, чтобы тип был «декодируемым» или «кодируемым», им необходимо «декодировать из чего-то» и «кодировать во что-то».
Настоящее волшебство Codable происходит с протоколами Decoder и Encoder. Эти протоколы используются компонентами, которые кодируют/декодируют различные форматы данных, такие как JSON. В Swift у нас есть несколько кодеров:
- PropertyListEncoder и PropertyListDecoder для списков свойств .plist
- JSONEncoder и JSONDecoder для JSON — это мы!
- NSKeyedArchiver может работать с Codable через PropertyListEncoder, Data и NSCoding
Классы JSONDecoder и JSONEncoder используют эти протоколы Decoder и Encoder для обеспечения функциональности для декодирования/кодирования JSON. Это также означает, что вы можете написать свой собственный кодировщик/декодер для Codable, при условии, что вы примете протоколы декодера и кодировщика!
Нужно освежить в памяти протоколы в Swift? Читайте протоколы в Swift, чтобы наверстать упущенное.
Давайте рассмотрим пример. Мы собираемся сопоставить некоторые данные JSON со структурой Swift. По сути, мы декодируем JSON в реальный объект Swift.
Сначала мы создаем структуру с именем User. Вот так:
struct User: Codable {
var first_name: String
var last_name: String
var country: String
}
Структура User имеет три простых свойства типа String и соответствует протоколу Codable.
Тогда давайте напишем немного JSON. Вот JSON, с которым мы будем работать:
{
«first_name»: «John»,
«last_name»: «Doe»,
«country»: «United Kingdom»
}
Данные JSON обычно поступают в ваше приложение. в качестве ответа на запрос веб-службы или через файл .json, но в этом примере мы просто помещаем JSON в строку. Вот так:
let jsonString = «»»
{
«first_name»: «John»,
«last_name»: «Doe»,
«country»: «United Kingdom»
}
«»»
Примечание: В приведенном выше коде используется тройная кавычка «»» для создания многострочных строк. Аккуратный!
Далее мы декодируем JSON и превращаем его в объект User. Вот так:
пусть jsonData = jsonString.data(используя: . utf8)!
позволить пользователю = попробовать! JSONDecoder().decode(User.self, from: jsonData)
print(user.last_name)
// Вывод: Doe
Вот что происходит:
- Сначала вы превращаете jsonString в объект Data, вызывая data( используя:) функцию в строке. Это необходимый промежуточный шаг.
- Затем вы создаете объект JSONDecoder и сразу же вызываете для него функцию decode(_:from:). Это превращает jsonData в объект типа User путем декодирования JSON. Тип User.self предоставляется в качестве параметра.
- Наконец, вы распечатываете фамилию пользователя с помощью print(user.last_name). Это пользовательское значение имеет тип User, так что это настоящий объект Swift!
Легко, правда? По сути, вы «сопоставили» объект JSON со структурой Swift и декодировали формат JSON в собственный объект, с которым Swift может работать.
В приведенном выше коде мы игнорируем любые ошибки, выдаваемые decode(_:from:) с помощью try!. В вашем собственном коде вам нужно будет обрабатывать ошибки с помощью блока do-try-catch. Ошибка, которая может возникнуть, например, возникает из-за предоставления недопустимого JSON.
User.self — это метатип, ссылка на сам тип User. Мы сообщаем декодеру, что хотим декодировать данные с помощью структуры User, предоставляя ему ссылку на этот тип.
Распространенная ошибка при определении типа Codable, такого как структура User, — несоответствие ключей и свойств. Если вы добавили в свою структуру свойство, которого нет в JSON или оно имеет другой тип, вы получите ошибку при декодировании JSON. Наоборот, то есть свойство, которое не существует в вашей структуре, но существует в JSON, не является проблемой. Проще всего отлаживать это свойство за раз, т. е. продолжать добавлять свойства до тех пор, пока JSON не перестанет декодироваться без ошибок. Вы также можете определить, какие свойства/ключи включать или игнорировать с помощью перечисления CodingKeys (см. ниже).
Давайте еще раз взглянем на пример из предыдущего раздела и расширим его. Вот JSON, с которым мы работаем:
let jsonString = «»»
{
«first_name»: «John»,
«last_name»: «Doe»,
«country»: «United Kingdom»
}
«»
Затем мы превращаем это в объект данных. Вот так:
пусть jsonData = jsonString.data(используя: .utf8)!
Это необходимый промежуточный шаг. Вместо того, чтобы представлять JSON в виде строки, мы теперь храним JSON как собственный объект данных. Кодировка символов, которую мы используем для этой строки, — UTF8.
Если вы внимательно посмотрите, то увидите, что приведенный выше код использует принудительную распаковку для работы с необязательным возвращаемым значением из данных (используя:). Давайте развернем этот необязательный элемент более элегантно!
if let jsonData = jsonString.data(using: .utf8)
{
// Использовать `jsonData`
} else {
// Реагировать на ошибку
}
С помощью приведенного выше кода мы можем реагировать на ошибки, когда данные (используя 🙂 возвращает ноль. Например, вы можете отобразить сообщение об ошибке или молча разрешить выполнение задачи и сохранить диагностическую информацию в журнале.
Далее мы создаем новый объект JSONDecoder. Вот так:
let decoder = JSONDecoder()
Затем мы используем этот декодер для декодирования данных JSON. Вот так:
пусть пользователь = попробуйте! decoder.decode(User.self, from: jsonData)
Однако функция decode(_:from:) может вызывать ошибки. Приведенный выше код дает сбой всякий раз, когда это происходит. Опять же, мы хотим реагировать на любые ошибки, которые могут произойти. Вот так:
do {
let user = try decoder.decode(User.self, from: jsonData)
print(user.last_name)
} catch {
print(error.localizedDescription)
}
Весь блок кода теперь выглядит следующим образом. Видишь, чем отличается?
if let jsonData = jsonString.data(используя: .utf8)
{
let decoder = JSONDecoder()
do {
let user = try decoder.decode(User.self, from: jsonData)
print(user. last_name)
} catch {
print(error.localizedDescription)
}
}
Не замалчивать ошибки. Перехватите ошибку и отреагируйте на нее либо с помощью UI/UX, повторив задачу, либо зарегистрировав ее, вызвав сбой и исправив ее.
Работа с CodingKeys
Что делать, если наши свойства JSON, такие как first_name и/или firstName, отличаются от свойств структуры Swift? Вот тут и приходит на помощь CodingKeys.
Каждый класс или структура, соответствующие Codable, могут объявлять специальное вложенное перечисление под названием CodingKeys. Вы используете его для определения свойств, которые должны быть закодированы и декодированы, включая их имена.
Давайте рассмотрим пример. В приведенной ниже структуре User мы изменили имена свойств с snake_case на camelCase. Например, ключ first_name теперь называется firstName.
struct User:Codable
{
var firstName: String
var lastName: String
var country: String
enum CodingKeys: String, CodingKey {
case firstName = «first_name»
case lastName country2 = «last_name» 24 }
}
При использовании приведенной выше структуры с примерами из предыдущих разделов вы увидите, что можно использовать объект User с новыми именами свойств. Вот так:
print(user.firstName)
// Вывод: Джон
print(user.country)
// Вывод: Великобритания
Перечисление CodingKeys сопоставляет свои случаи со свойствами и использует строковые значения для выбора правильных имен свойств в данных JSON. Регистр в перечислении — это имя свойства, которое вы хотите использовать в структуре, а его значение — это имя ключа в данных JSON.
До сих пор мы фокусировались на декодировании данных JSON в объекты Swift. А если пойти другим путем? Можем ли мы также кодировать объекты как JSON? Да, почему бы и нет!
Вот так:
var user = User()
user.firstName = «Боб»
user.lastName = «и Алиса»
user.country = «Криптоленд»
let jsonData = попробуйте! JSONEncoder().encode(user)
let jsonString = String(данные: jsonData, кодировка: .utf8)!
print(jsonString)
И вывод:
{«страна»:»Криптоленд»,»имя»:»Боб»,»фамилия»:»и Алиса»}
Что здесь происходит?
- Сначала вы создаете объект User и присваиваете некоторые значения его свойствам
- Затем вы используете encode(_:) для кодирования объекта пользователя в объект данных JSON
- Наконец, вы преобразуете объект данных в строку и распечатываете ее
- Внутри этой структуры мы определили другую структуру с именем User. Это точно такой же тип, который мы использовали раньше. Эта структура является «вложенной».
- Структура Response имеет одно свойство, называемое пользователями типа [User], или массив объектов User.
Если вы внимательно посмотрите, вы увидите, что кодировка следует те же шаги, что и при декодировании, только в обратном порядке.
Переход от объекта Swift через декодер, в результате чего получается строка JSON.Как и прежде, можем ли мы расширить пример для работы с ошибками? Да! Вот так:
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
do {
let jsonData = try encoder.encode(user)
if let jsonString = String(data: jsonData, encoding: .utf8) {
print(jsonString)
}
} catch {
print(error.localizedDescription )
}
В приведенном выше примере мы также используем свойство outputFormatting кодировщика для «красивой печати» данных JSON. Это добавляет пробелы, вкладки и новые строки, чтобы упростить чтение строки JSON. Вот так:
{
«страна»: «Криптоленд»,
«имя»: «Боб»,
«last_name» : «и Алиса»
Отлично!
Стоит отметить, что словари в Swift, как и в JSON, не имеют фиксированного порядка сортировки. Вот почему вы увидите разные порядки сортировки для ключей страны, имени и т. д. в JSON, если вы запустите приведенный выше код несколько раз. Большинство веб-сервисов, которые выводят JSON, применяют фиксированный порядок сортировки через схему, что определенно упрощает чтение и навигацию по JSON.
До сих пор мы работали с простыми объектами JSON — просто классом с несколькими свойствами. Но что, если данные, с которыми вы работаете, более сложны?
Например, данные JSON, которые вы можете получить из веб-сервиса Twitter или Facebook, часто являются вложенными. То есть данные, до которых вы хотите добраться, зарыты в 2-3 уровня JSON-массивов и словарей. Что теперь!?
Сначала рассмотрим простой пример. Вот структура Swift, с которой мы будем работать:
struct Пользователь: Codable {
var first_name: String
var last_name: String
}
Затем данные JSON, которые мы хотим декодировать:
let jsonString = «»»
[
{
«first_name»: «Arthur»,
«last_name»: «Dent»
}, {
«first_name»: «Zaphod»,
«last_name»: «Beeblebrox»
}, {
«first_name» : «Марвин»,
«last_name»: «Андроид-параноик»
}
]
«»»
Если присмотреться, то видно, что нужные нам данные хранятся в виде массива. JSON — это не один простой объект, а массив с тремя объектами User. Мы знаем, что это массив объектов, благодаря квадратным скобкам [ ] (массив) и фигурным скобкам { } (объект). Несколько элементов всегда разделяются запятыми.
Как мы можем расшифровать эти объекты User? Вот как:
пусть jsonData = jsonString.data(используя: .utf8)!
позволить пользователям = попробовать! JSONDecoder().decode([User].self, from: jsonData)
for user in users {
print(user.first_name)
}
Фрагмент кода выше очень похож на то, что вы видели раньше, но есть одно важное отличие. Видите тип, который мы предоставляем функции decode(_:from:)? Тип — [User] (с .self) или «массив объектов User». Вместо того, чтобы работать с одним объектом User, мы хотим декодировать их кучу, и это обозначается типом массива [User].
Далее мы обсудим, как можно работать с более сложными вложенными типами. Предположим, например, что массив объектов User вложен в словарь JSON. Вот так:
let jsonString = «»»
{
«пользователи»:
[
{
«имя»: «Артур»,
«фамилия»: «Дент»
}, {
«имя»: «Зафод »,
«last_name»: «Beeblebrox»
}, {
«first_name»: «Марвин»,
«last_name»: «Андроид-параноик»
}
]
}
«»»
В приведенном выше фрагменте JSON элемент верхнего уровня — это словарь (или «объект»). У него есть только одна пара ключ-значение: массив пользователей. Нужные нам данные находятся внутри этого массива. Как нам добраться до него?
Важно, чтобы наш подход не был слишком сложным. Легко подумать, что вам понадобится расширенный синтаксический анализ JSON, но, как оказалось, мы также можем вкладывать структуры Swift. Мы собираемся описать весь JSON как структуру со структурой User внутри нее.
Вот, посмотрите:
struct Response: Codable
{
struct User: Codable {
var first_name: String
var last_name: String
}
var users: [User]
}
Вот что происходит 90-78 Уровень 90-010: 900 Словарь JSON соответствует типу Response. Как и прежде, этот тип соответствует Codable для поддержки кодирования и декодирования JSON.
Самое интересное, что семантически структуры данных JSON и Swift абсолютно одинаковы. Они просто используют другой синтаксис. Мы определили вложенный массив внутри словаря верхнего уровня, точно так же, как структура Response имеет вложенную структуру User и свойство пользователей внутри нее.
Заставить его работать теперь проще простого. Проверьте это:
let jsonData = jsonString.data(используя: .utf8)!
пусть ответит = попробуй! JSONDecoder().decode(Response.self, from: jsonData)
для пользователя в response.users {
print(user.first_name)
}
Посмотрите, как мы используем тип Response для декодирования JSON, а затем зацикливаться на свойстве response.users? Проверьте это с помощью структуры Response и файла JSON. Мы выбираем пару ключ-значение пользователя в словаре верхнего уровня и сопоставляем объекты внутри с объектами пользователя. Аккуратный!
Использование вложенных типов — отличный универсальный подход к сложным структурам данных JSON.