Пошаговое руководство по преобразованию полного приложения Objective-C в Swift

Опубликовано: 2018-03-14

С момента своего выпуска в 2014 году язык программирования Apple Swift претерпел феноменальный рост. Языку программирования удалось занять свое место в топ-10 языков программирования , разделив позицию со своим предшественником, Objective-C. Но война Swift против Objective-C никогда не утихает.

С ростом популярности и интересными функциями многие разработчики приложений для iOS, которые ранее работали с Obj-C, перешли на язык программирования Swift. На самом деле, в борьбе за Swift или Objective-C для iOS различные приложения iOS, такие как LinkedIn, Yahoo Weather, Hipmunk и Lyft, уже были обновлены с Objective-C до Swift, в то время как многие планируют конвертировать приложение Objective-C. к Свифт.

ФАКТОРЫ, ДЕЛАЮЩИЕ SWIFT ЛУЧШИМ ВАРИАНТОМ

Лично я наблюдал эволюцию Swift с тех пор, как была представлена ​​его первая версия, и я могу сказать, что между Swift и C Swift превосходит Objective-C на основе таких факторов, как

Открытый источник

Swift — это язык с открытым исходным кодом, и код Swift может быть переносим на гораздо большее количество платформ, чем когда-либо был Objective-C.

Скорость

Swift для разработки iOS — это язык со статической типизацией, который работает с компилятором LLVM и может повторно использовать существующий код, удалять неиспользуемые ресурсы, управлять встроенными функциями и т. д. Кроме того, его работа основана на одном из самых быстрых арифметических расчетов алгоритма C++, что, в свою очередь, доказывает, что он имеет конкурентное преимущество перед своим предшественником.

Согласно заявлениям Apple и моим наблюдениям, алгоритм поиска Swift в 2,6 раза быстрее, чем Objective-C.

Читабельность

В отличие от Objective-C, Swift не привязан к основам C. Он позволяет разработчикам iOS удалять вызовы вложенных методов, пропускать точку с запятой в конце строки, избегать использования @ в начале ключевого слова, объединять строки с помощью знака «+» и т. д. Кроме того, класс Swift не делится на части, интерфейс и реализацию. Это сократило длину кода почти вдвое, сделав его более читаемым.

Например, когда приложение Lyft было переписано на языке Swift с нуля, код приложения уменьшился с 75 000 до 25 000 строк. Эти впечатляющие цифры сократили усилия разработчиков, не влияя на производительность приложения на стороне клиента.

Интерактивное кодирование

Благодаря функции Playgrounds он позволяет программистам писать фрагменты кода или алгоритмов, собирая отзывы на этапе разработки. Поскольку код Swift написан с использованием визуализации данных, это делает процесс разработки приложений более простым и доступным.

Безопасность

Swift — более безопасный и безопасный язык для создания приложений в соответствии с текущими тенденциями рынка. Его синтаксис и языковая конструкция исключают типы ошибок, обычно наблюдаемые при написании кода на языке Objective-C. Это означает, что меньше шансов на сбой приложения и случаи проблемного поведения.

В отличие от Objective-C, код, написанный на Swift, может быть скомпилирован и ошибки могут быть исправлены вместе с частью написания кода. Следовательно, Swift действует лучше и быстрее в процессе тестирования по сравнению с процессом тестирования кода Objective-C.

техническое обслуживание

Поскольку Swift не зависит от C, как его предшественник, обслуживание при разработке приложений на Swift намного проще. Что-то, что сделало Swift будущим разработки приложений для iOS .

В случае создания приложения для iOS с использованием Objective-C разработчики должны были поддерживать два отдельных файла кода, чтобы сократить время сборки и эффективность кода. Однако Swift отказался от этого двухфайлового механизма, объединив заголовок Objective-C (.h) и файлы реализации (.m) в один файл (.swift). Компилятор LLVM автоматически обнаруживает зависимости при чтении файла Swift, что является большим преимуществом для разработчиков приложений iOS.

Помимо вышеупомянутых факторов, важным преимуществом выбора Swift по сравнению с другими языками программирования Apple является его совместимость с Objective-C. Apple предложила разработчикам приложений возможность использовать оба языка в одном проекте. Это полезно не только в случае разработки приложения iOS с использованием Swift с нуля, но и при обновлении существующего приложения до Swift с использованием кода Objective-C.

Теперь, когда вы знакомы с философскими различиями между двумя языками разработки приложений для iOS, давайте перейдем к различиям при практической реализации.

SWIFT VS OBJECTIVE-C: ОСНОВНЫЕ РАЗЛИЧИЯ ТИТАНОВ РАЗРАБОТКИ IOS

Благодаря моему опыту работы со сложной кодовой базой Objective-C и кодовой базой Swift вы столкнетесь с несколькими обновлениями существующих концепций, а также с введением в различные новые элементы, ускоряющие процесс разработки приложений. Без лишних слов, давайте посмотрим на все, что вы найдете нового/отличного в войне свифт против объектива c.

Опции

Когда мы говорим о производительности swift и Objective-C, мы можем вызывать методы для объектов nil, чтобы получить нулевое значение в Obj-C. Мы должны вручную выполнять проверки нуля, чтобы понять поведение undefined в случае неожиданного значения nil. Однако эту проблему можно решить с помощью опционального, новой концепции, представленной в коде Swift. Необязательный позволяет функциям, которые не могут возвращать значимое значение, возвращать значение, инкапсулированное в необязательном или nil.

Синтаксис объявления опционального типа:

Открытое перечисление Необязательный<Wrapped> :_Reflectable, NilLiteralConvertible

На практике он может иметь либо значение типа Wrapped, либо несуществующее значение.

Swift делает синтаксический сахар для объявления типов необязательными, поэтому мы можем заменить Optional<String> на String?

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

Необязательная цепочка: используется в случае, когда условный оператор if-let получит значение, только если он существует.
Forced Wrapping: используется, когда необязательная объявленная переменная не равна нулю. Если значение существует, оно предоставит вывод без реализации условий. Но, в другом случае, он рухнет.
Мы также можем найти неявно развернутые опции в языке Swift, объявленные как String!

Например:

Класс XКласс

{

вар aString: Строка

вар bString: Строка!

вар cString: Строка?

Инициализация (строка: строка)

{

строка = строка

}

}

Здесь,

Строка никогда не может быть нулевой. Крайне важно, чтобы эта переменная имела значение при инициализации объекта, иначе программа приведет к падению.
B Строка может быть нулевой. Однако, если вы попытаетесь получить доступ к нулевому объекту, программа рухнет.
Строка C может быть нулевой и должна рассматриваться как обычная необязательная переменная.
Расширения
Расширения и категории, найденные в Obj-C, объединены в единую сущность, расширения на языке Swift. Расширения добавляют новую функциональность к уже существующему классу, перечислению, структуре или протоколу, и самое приятное то, что вам не нужно иметь доступ к исходному коду для расширения типов.

Кортежи
Помимо опционов, еще один новый тип данных, представленный в новом языке разработки Apple, — кортежи. Кортежи (вместо определяемого пользователем типа данных) в основном считаются группирующими множество значений в одну составную группу. Это правильный элемент, который следует учитывать, если вы считаете, что создание модели в каком-либо месте может оказаться излишним, а словарь недостаточно удобен для чтения. Чтобы узнать больше о кортежах, обратитесь к этому блогу .

Дженерики
Generics — одна из самых ярких особенностей языка программирования Swift, и на самом деле большая часть стандартных библиотек Swift создается с помощью кода Swift. Универсальный код позволяет разработчикам писать гибкие повторно используемые функции и типы, которые могут работать с различным набором типов в соответствии с определенными требованиями. Это сводит к минимуму риск дублирования и повышает читабельность кода благодаря четкому абстрактному подходу.

По моему опыту, поначалу получить дженерики сложно, как и рекурсии. Но когда вы возьмете его в руки, вы сможете открыть для себя целый новый мир решения утомительных логических задач.

перечисление
В коде Objective-C перечисления ограничены примитивными типами. Для сопоставления целочисленных значений перечисления со строками для отображения вывода вы должны ввести массив или обратиться к структуре управления переключателем. Однако вам не нужно преодолевать эти трудности с языком разработки приложений Swift для iOS.

Swift предлагает разнообразные новые перечисления с большим количеством опций. Перечисления Swift могут иметь связанные значения, а случай перечисления Swift может содержать предопределенный набор полей. На самом деле перечисления Swift могут быть рекурсивными и хранить необработанные значения.

Например:
коды

Индексы
Индексы можно рассматривать как средство доступа к информации из последовательности, коллекции или списка в классах, перечислениях и структурах без использования метода. Вы можете использовать индексы для установки и извлечения значений по индексу, не создавая отдельных методов для хранения и извлечения. Например, вы можете получить доступ к элементам экземпляра Array как someArray[index], а к элементам экземпляра Dictionary — как someDictionary[key].

Синтаксис объявления Subscript следующий:

индекс (индекс: Int) -> Int {

получить {

//для объявления значения индекса

}

установить (новое значение) {

//для определения значений

}

}

Вывод типа

Swift также предложил безопасность типов для разработки приложений iOS, согласно которой переменная, объявленная с определенным типом, ее тип будет статическим и неизменяемым. Компилятор определит (или сделает вывод), какого типа будет ваша переменная на основе назначенных вами значений.

Например:

код 1
Здесь компилятор покажет ошибку, когда вы попытаетесь инициализировать числовыми значениями переменную str2 (см. ниже).

код 03

Функции
Синтаксис функции в языке программирования Swift более гибок для определения, чем в сложном стиле кода Objective-C. В Swift каждая функция имеет тип, который состоит из типов параметров функции и типа возвращаемого значения, что означает, что вы можете назначать функции переменной или передавать ее как значение другим функциям (как показано в примере ниже):

изображение кода

Помимо этого, Swift также позволяет разработчикам приложений определять значения по умолчанию для функциональных параметров.

Обработка ошибок
Swift предлагает совершенно новый подход к генерации, перехвату, распространению и манипулированию исправимыми ошибками во время выполнения. Чтобы получить представление об обработке ошибок в Swift, обратитесь к блогу.

Помимо этого, различные концепции, которые делают разработку приложений Swift беспроигрышной по сравнению с разработкой приложений Objective-C:

Модели
В случае Swift модели предпочитают быть структурами, а не классами.

Протоколы
В самом первом видеоролике Apple WWDC, swift был представлен как «протокольно-ориентированный язык». Протокол можно определить как план методов, свойств и других объектов, которые подходят для конкретной задачи/функции. Они могут быть включены в класс, перечисление или структуру, чтобы облегчить фактическую реализацию этих требований, и являются гораздо более мощными по сравнению с Obj C с функциями предоставления реализаций по умолчанию, включения дженериков и т. д.

Как разработчик iOS-приложений, я предпочитаю сначала создать протокол, а затем определить класс, поскольку это наиболее эффективная практика использования преимуществ продвинутого языка программирования Apple.

Функциональный подход к программированию
Swift позволяет разработчикам использовать больше функциональных подходов для решения мирских проблем, чем традиционные циклы или типы ссылок. Здесь перспектива состоит в том, чтобы проанализировать проблему с точки зрения решения, а не определять, как получить решение, как это делается в традиционном подходе.

Из моего опыта работы с обоими языками iOS я заметил одну вещь: то, что мы делали с помощью итераций, используя циклы for в Objective-C, можно сделать с помощью концепции Filter, Map и Reduce в Swift. Чтобы получить более подробную информацию об этих функциях высокого порядка в функциональном программировании, обратитесь к блогу.

ПОШАГОВОЕ РУКОВОДСТВО ПО ПРЕОБРАЗОВАНИЮ ПОЛНОГО ПРИЛОЖЕНИЯ OBJECTIVE-C В SWIFT

Сегодня существуют различные инструменты для построчного преобразования приложения из Objective-C в Swift. Тем не менее, я советую не использовать любой. Хотя оба языка iOS совместимы, парадигмы их программ различны. Миграция приложения с Obj-C на Swift напрямую повышает риск использования неправильных парадигм. Позвольте мне уточнить это.

Swift, в отличие от своего предшественника, находится под влиянием парадигмы функционального программирования, что заставляет его в значительной степени полагаться на неизменность. Например, если вы говорите о массивах и словарях — эти базовые модели используются как ссылочные типы в Objective-C, но в Swift они являются типами значений, поэтому неизменяемы. Это означает, что подсознательное преобразование кода Obj-C в Swift с использованием любого инструмента приведет к множеству ошибок, которые трудно отладить. Кроме того, в Swift появилось множество новых функций (как уже было описано выше), которые делают алгоритмы/подходы более эффективными, а программы — более быстрыми! Фактически, это основная причина, по которой Apple представила новый язык, а не обновила Obj-C. Принимая во внимание все эти моменты, я настоятельно рекомендую всем написать новое приложение на Swift с нуля, а не выполнять построчное преобразование из Obj-C в Swift.

Тем не менее, если вы хотите преобразовать полное приложение Objective-C в Swift, одним из инструментов, который вы можете использовать, является Swiftify. Инструмент упрощает процесс обновления кода Obj-C до нового языка программирования Apple одним щелчком мыши; экономия тысяч рабочих часов. Функция взаимодействия позволяет без проблем интегрировать преобразованный код iOS обратно в Objective-C, что означает, что вы можете изучить множество вариантов, которые предлагает Swift, а затем интегрировать его обратно в свой проект Obj-C, не переписывая все сразу.

Подготовьте существующий код приложения для преобразования
Всегда лучше начинать с последнего кода Obj-C. Это связано с тем, что Xcode использует современный конвертер Objective-C, который может помочь вам:

1. Изменение идентификатора на тип экземпляра везде, где это возможно
2. Использование правильных макросов enum
3. Переход на более свежий синтаксис @property

Хотя преобразователь помогает с механикой анализа и внесения возможных изменений, он не отражает семантику кода. Таким образом, всем разработчикам iOS-приложений рекомендуется один раз просмотреть все вручную, а затем подтвердить изменения.

Чтобы использовать конвертер, выберите Правка -> Рефакторинг -> Изменить синтаксис на современный Objective-C.

Процесс переноса кода Objective-C на Swift
Наиболее эффективный подход к преобразованию полного приложения Objective-C в Swift — это, для начала, один класс за раз, особенно класс без какого-либо подкласса, поскольку вы не можете подклассифицировать классы Swift в Obj-C.

Замените файлы .m и .h, относящиеся к классу, одним файлом .swift. При этом все, от интерфейса до реализации, автоматически попадет в файл Swift. Кроме того, вам не нужно создавать заголовочный файл, так как Xcode автоматически генерирует заголовок, если это необходимо.

Проектирование заголовочного файла моста
Когда вы добавите свой первый файл .swift, вы увидите приглашение, подобное показанному ниже.

быстрый код12

Нажмите на опцию « Создать заголовок моста ».

Пошаговое руководство

1. Выберите пару файлов .h и .m, которые вы хотите преобразовать в Swift. Если вы хотите преобразовать весь проект, оставьте класс AppDelegate на потом.
2. Найдите в коде #import «MyViewController.h» и удалите его из файла заголовка моста Objective-C ([MyProject]-Bridging-Header.h).
3. Замените экземпляры #import «[filename].h» на #import «[MyProject]-Swift.h» во всех файлах .m и поместите @class [filename] вместо #import «[filename].h» в все файлы .h.
4. Преобразуйте часть файлов Obj-C в Swift. Это можно легко сделать с помощью расширения Finder для Swiftify for Xcode. В противном случае скопируйте содержимое файлов .m и .h в .swift и используйте параметр «Преобразовать файл в Swift», доступный в расширении Swiftify Xcode.
5. Замените в проекте файлы .h и .m преобразованными файлами .swift.
6. Скомпилируйте проект и исправьте ошибки конвертации. Хотя многие проблемы можно легко решить с помощью предложений по автоматическому исправлению Xcode, вы также можете положиться на Swiftify, чтобы сообщать и исправлять ошибки, появляющиеся несколько раз в проекте.
7. После этого создайте и запустите проект. Если возникает проблема «Класс не найден» с последующим сбоем, найдите все ссылки на нее в редакторе раскадровки. Повторно введите имя класса в Identity Inspector, сохраните и повторите попытку.
8. Если вы конвертируете весь проект, вы можете преобразовать класс AppDelegate прямо сейчас. На этом этапе все остальные файлы были преобразованы в Swift, и поэтому, если в цели не осталось файлов Obj-C, вы можете легко удалить файл main.m и .pch (предварительно скомпилированный заголовок).

Какую практику вы предпочитаете — создать новое iOS-приложение на Swift с нуля или полностью преобразовать Objective-C в Swift? Поделитесь своим мнением в разделе комментариев ниже.