Какой опыт с Objective-C
Что проверяют
Сможете ли вы поддерживать старый код и SDK, которые до сих пор написаны на Objective-C, и понимаете ли, как он стыкуется со Swift. Следом обычно спрашивают про управление памятью и про работу на границе двух языков.
Как отвечать
Начните с контекста: сколько в проекте было Objective-C и что вы в нём делали (правки, миграция модулей, обёртки над сторонней библиотекой). Объём и сроки называйте свои. Если писали только на Swift, скажите прямо, что читаете Objective-C и работали с ним на уровне интеропа, и покажите основы:
- сообщения: вызов метода это отправка сообщения через
objc_msgSendс разрешением в рантайме. Отсюда categories, method swizzling, KVO; - nil: сообщение
nilне падает и возвращает ноль илиnil, поэтому ошибки молча проглатываются; - память: ARC по умолчанию, атрибуты
strong,weak,copy,assign. Блоку, который захватываетself, нужен__weak, иначе цикл удержания; - интероп: bridging header для доступа из Swift, сгенерированный
ModuleName-Swift.hдля обратного направления,@objcу Swift-кода; - аннотации:
NS_ASSUME_NONNULL_BEGIN,nullable, лёгкие дженерикиNSArray<NSString *> *иNS_SWIFT_NAME, чтобы API нормально выглядел в Swift, а не как набор неявно развёрнутых опционалов.
Если была миграция, расскажите порядок: сначала аннотации и тесты, потом перенос по модулям снизу вверх, а не переписывание всего разом.
Где спотыкаются
Говорят «Objective-C мёртв, он мне не нужен». Для iOS-разработчика это сигнал, что с легаси и чужими SDK будут проблемы.
Не могут объяснить, зачем copy у свойства NSString. Туда может прийти NSMutableString, и строку изменят снаружи после присвоения.
Считают, что do/catch в Swift ловит NSException. Не ловит: исключение Objective-C роняет приложение, из Swift перехватываются только ошибки через NSError **.