«Objective-Swift или Swiftjective-C? Как работать с легаси в современном мире», Сбербанк, Владислав Усачёв

5d08ba0cd07942f2ddbf82e5b21ba5e7?s=47 FunCorp
March 23, 2019

«Objective-Swift или Swiftjective-C? Как работать с легаси в современном мире», Сбербанк, Владислав Усачёв

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

Как избежать Objective-Swift?
Зачем мне всё это на Swift?
Совместимость Objective-C и Swift в одном модуле, так ли просто?

5d08ba0cd07942f2ddbf82e5b21ba5e7?s=128

FunCorp

March 23, 2019
Tweet

Transcript

  1. Objective-Swift или Swiftjective-C? Как работать с legacy в современном мире.

    Усачёв Владислав
  2. Немного о себе 2

  3. План 1. Цели, которые преследовались при переходе 2. Процесс переписывания/интеграции

    Swift 3. Боль 4. Итоги, графики, сравнение 3
  4. Цели • Активное iOS community делает акцент на Swift •

    Начать найм сотрудников со знанием Swift • Получить меньшее время разработки отдельной фичи • Быть в трендe 4
  5. Ожидания • Сократиться количество багов регресса • Увеличится время сборки

    framework-a • Будет больно 5
  6. План 1. Цели, которые преследовались при переходе 2. Процесс переписывания/интеграции

    Swift 3. Боль 4. Итоги, графики, сравнение 6
  7. @objc • Позволяет видеть Swift классы в Obj-C коде •

    Происходит автогенерация интерфейса класса в <MyProjectName-Swift.h> 7
  8. 8 • Изменяется супер класс

  9. 9

  10. • Добавление новых методов 10

  11. 11

  12. • Изменения размеров класса 12

  13. 13

  14. Импортирование Obj-c и Swift 14 Говорит о том, что дальше

    пойдут символы для языка Swift В объявлении класса присутствует директива @objc Представляет тип класса Название таргета вместе с длинной названия Название класса вместе
 с длинной названия F _TtC13ConferenceApp7MyClass _Z
  15. 15

  16. • SWIFT_CLASS связанно с именем класса, заданное ему в Runtime

    16 • SWIFT_CLASS_NAMED связанно с именем класса, заданное во время компиляции
  17. 17

  18. 18 •Для видимости Swift кода достаточно импорта <ConferenceApp-Swift.h> •Для видимости

    Obj-C достаточно …. Ничего
  19. •Импорт из Swift через <MyProjectName-Swift.h> •Импорт из Obj-C через BridgingHeader

    •Название Swift классов лучше переопределять 19 Для таргета Framework существуют некоторые отличия
  20. 20 • Swift классы необходимо делать публичными • При помощи

    такого синтаксиса делаем импорт
  21. 21 Есть 2 стула способа импорта Obj-C в Swift Umbrella

    header framework-a • Класс надо делать публичным • Наружу видны классы, которые не должны быть видны • Увеличивает время компиляции
  22. 1 2 3 4 1. Название модуля 2. Определение необходимых

    фичей 3. Объявление сабмодуля 4. Название класса для импорта 22
  23. 23

  24. 24 • Не захламляем umbrella header • Файлы остаются видимости

    «Project» ModuleMap > Umbrella header
  25. •Импорт из Swift через <MyProjectFramework/ MyProjectFramework-Swift.h> •Импорт из Obj-C через

    umbrella-header или ModuleMap 25
  26. •При создании Obj-C класса весь интерфейс лучше завернуть в макросы

    NS_ASSUME_NONNULL_BEGIN/ NS_ASSUME_NONNULL_END •Для того, что может быть nil указывать nullable •Относится не только к свойствам, но и к аргументах в методах nonnull/nullable 26
  27. nonnull/nullable 27

  28. 28

  29. 29

  30. 30

  31. •Не забывать пользоваться макросами •Проставлять nullable там, где это необходимо

    31
  32. Generic 32

  33. 33 •Для всех коллекций в Obj-C лучше добавлять Lightweight Generics

    •Перенести Generics из Swift не получится
  34. Обработка ошибок 34

  35. • Процесс довольно простой • По возможности, обработку ошибок вынести

    в Swift и делать через enum Result • @try @catch в Objective-C не то же самое, что и в Swift 35
  36. Enum 36

  37. 37

  38. • Enum в Obj-C должен иметь целочисленный тип • Работает

    только через макрос NS_ENUM • Enum в Swift так же должен иметь целочисленный тип 38
  39. План 1. Цели, которые преследовались при переходе 2. Процесс переписывания/интеграции

    Swift 3. Боль 4. Итоги, графики, сравнение 39
  40. Боль • Как писать тесты после Objective-C? • Как привыкнуть

    к новым гайдам? • Как сделать так, чтобы потом ничего не развалилось? 40
  41. Clean Architecture Clean Swift VIPER 41 Архитектура

  42. • Нужно всегда продумать архитектуру • Это упростит и ускорит

    ревью 42
  43. Тесты 43

  44. 44

  45. Гайды 45

  46. 46 SwiftLint • Более 500 новых ворнингов • 400 из

    них насчёт лишних пробелов • Существенно упрощает ревью
  47. План 1. Цели, которые преследовались при переходе 2. Процесс переписывания/интеграции

    Swift 3. Боль 4. Итоги, графики, сравнение 47
  48. Статистика • Времени билда (Swift/Objective-C) • Количество строк кода (Swift/Objective-C)

    • Количество затраченного времени на таску • Количество багов с регресса 48
  49. Количество строк кода • Старый функционал: 11581 строк Obj-C •

    Новый функционал: 24625 всего, 15281 строк Obj-C, 9344 строк Swift 49
  50. Среднее время билда • Старый фунционал: 5,4 секунды • Новый

    фунционал: 9,6 секунд • Старый функционал: 11581 строк Obj-C • Новый функционал: 24625 всего, 15281 строк Obj-C, 9344 строк Swift • Количество строк кода увеличилось в ~2.2 раза • Время билда увеличилось в ~1.8 раз 50
  51. Среднее время выполнения задачи 51

  52. Баги • 15 багов за все время в новой команде

    • 4 по новому функционалу
  53. План 1. Цели, которые преследовались при переходе 2. Процесс переписывания/интеграции

    Swift 3. Боль 4. Итоги, графики, сравнение 53
  54. Спасибо! 54 • ConferenceApp: https://github.com/phoe3nix/ conferenceApp • ConferenceFramework: https://github.com/phoe3nix ConferenceFramework

    • Telegram: @phoe3nixx