Зачем появился Swift и какую проблему он решает
Что проверяют
Понимаете ли вы, какие проблемы Objective-C мешали Apple и разработчикам, а не только перечень плюсов Swift. Следом обычно спрашивают, чем опционалы лучше nil в Objective-C и как Swift уживается со старым кодом.
Как отвечать
Swift представили на WWDC в 2014 году, в 2015-м открыли исходники. Отвечать удобно через наследство C:
- безопасность: в Objective-C сообщение, отправленное
nil, молча возвращает ноль, и ошибка всплывает далеко от причины. В Swift отсутствие значения выражено типомOptional, компилятор заставляет его обработать. Выход за границы массива и переполнение целого останавливают программу, а не дают неопределённое поведение; - система типов: вместо
idи нетипизированных коллекций есть дженерики,enumсо связанными значениями,structс семантикой значения, протоколы с расширениями; - синтаксис и инфраструктура: нет заголовочных файлов, есть вывод типов, модули и Swift Package Manager;
- производительность: Objective-C тоже компилируется в машинный код, так что сравнение с интерпретируемыми языками мимо. Разница в диспетчеризации: в Objective-C вызов метода идёт через
objc_msgSend, а Swift для структур иfinalклассов вызывает методы статически и может их встраивать; - развитие: стабильный ABI в Swift 5 позволил держать рантайм в системе,
async/awaitи акторы появились в 5.5, в режиме языка Swift 6 компилятор проверяет гонки данных.
Про совместимость говорите точно: оба языка живут в одном проекте через bridging header и сгенерированный заголовок -Swift.h, но видимость ограничена. Структуры, enum со связанными значениями, дженерики и кортежи Swift из Objective-C не видны, нужен класс-наследник NSObject с @objc.
Где спотыкаются
Говорят, что Swift «полностью совместим» с Objective-C. Интервьюер тут же попросит вызвать из Objective-C метод, принимающий Swift-структуру.
Называют главным отличием строгую типизацию, хотя статические типы есть и в Objective-C. Суть в Optional, типах-значениях и отсутствии неопределённого поведения в безопасном коде.
Не знают истории ABI: до Swift 5 каждое приложение везло свою копию стандартной библиотеки, отсюда лишний вес сборки.