Изучите лучшие практики предоставления кода Swift для Objective-C.

Objective-C жив и здоров. Многие технологические компании все еще используют Objective-C в своих продуктах для iOS. Честно говоря, от интервью с этими местами меня это оттолкнуло чисто из-за упрямства. Я работаю со Swift 90% своей карьеры в iOS — почему я должен идти назад?

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

Что такое совместимость с Objective-C Swift

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

Почему люди до сих пор используют Objective-C?

У людей есть свои причины, по которым их приложение все еще использует Objective-C:

  • Недостаточно оснований для переноса приложения на Swift
  • Приложение зависит от библиотеки C++, где вам нужен Objective-C, чтобы использовать библиотеку.
  • Унаследованный проект должен жить дальше и так далее.

По сути, Objective-C все еще будет использоваться в мире, пока не устареет. На самом деле Apple до сих пор использует Objective-C.

Лучшие практики для успешной совместимости Objective-C и Swift

Я создал пример приложения для iOS с языком Objective-C. Чтобы увидеть эти лучшие практики в действии через консоль, вы можете проверить мой репозиторий GitHub здесь.

Импортируйте файл моста Swift

Если вы попытаетесь использовать функцию Swift внутри вашего файла реализации без импорта, тогда Xcode сгенерирует ошибку сборки, как показано ниже:

❌ Receiver ‘ViewModel’ for instance message is a forward declaration

Это сообщение об ошибке совершенно бесполезно. Таким образом, импорт файла моста Swift абсолютно необходим, если нам нужно вызвать функцию Swift в классе Objective-C. Без этого Obj-C не признает существование ваших функций Swift. Вы можете использовать функции Swift из класса или структуры внутри вашего файла реализации. Формат импорта вашего файла моста Swift выглядит следующим образом:

#import <YourProjectTarget-Swift.h>

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

Обязательно закройте этот импорт закрывающей угловой скобкой.

Чтобы использовать сторонние библиотеки, написанные на Swift, вы можете следовать тому же шаблону, чтобы импортировать код Swift внутри своей реализации (при условии, что они добавили поддержку Objective-C в свои общедоступные классы).

#import <ThirdPartyTarget/ThirdPartyTarget-Swift.h>

Добавьте поддержку Objective-C в свои функции

Если вы хотите предоставить одну или несколько определенных функций для Objective-C, добавьте к этим функциям префикс @objc.

Класс Swift должен наследоваться от NSObject. К сожалению, без соблюдения этого протокола вы увидите то же бесполезное сообщение об ошибке, которое мы обсуждали ранее.

Вот как мы можем использовать эту функцию в файле реализации:

Если бы у класса ViewModel были дополнительные функции без атрибута @objc, я бы не смог использовать их внутри ViewController.m.

Добавьте поддержку Objective-C в свой класс

Атрибут @objc отлично работает, если вам нужно использовать небольшое количество функций. Но по мере изменения требований и роста бизнес-логики постоянное повторение этого атрибута может стать обременительным. Чтобы предоставить все функции в классе для Objective-C, добавьте префикс @objcMembers перед объявлением вашего класса.

Ваш класс также должен наследоваться от NSObject.

Расширьте файл Objective-C с помощью Swift

Отличный способ добавить Swift в ваш проект — расширить существующий класс Objective-C. Недостатком этого является то, что вы не можете добавлять глобальные свойства в файлы расширения. Так что эта практика на ваше усмотрение. Используйте расширение, если ваш вариант использования прост.

Чтобы успешно расширить файл реализации, импортируйте файл заголовка класса в файл Bridging-Header.

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

Если у вас еще не было связующего заголовка, создайте его, если он не генерируется автоматически.

Затем импортируйте файл заголовка класса. Без этого шага ваш файл расширения не будет распознан.

Создайте и запустите свое приложение, и вы успешно расширили файл реализации в Swift!

Спасибо за прочтение! Чтобы узнать больше о разработке iOS, подписывайтесь на меня на Medium.

Рекомендации