К какому типу типизации относится Swift: динамической или статической?
Что проверяют
Знаете ли вы разницу между статической и динамической типизацией и не путаете ли её с выводом типов и динамической диспетчеризацией. Следом обычно спрашивают, что тогда делают Any, as? и ключевое слово dynamic.
Как отвечать
Swift статически и строго типизирован. Тип каждой переменной, параметра и выражения известен компилятору, и несовпадение типов ловится при сборке, а не в рантайме. Дальше разведите соседние понятия:
- вывод типов: в
let count = 10тип не написан, но он есть. Компилятор вывелInt, и поменять его уже нельзя. Это удобство синтаксиса, а не динамика; - строгость: неявных преобразований нет,
IntиDoubleбез явногоDouble(count)не сложить; Anyи приведение: переменная типаAnyхранит что угодно, но её статический тип всё равноAny. Проверкаas?идёт в рантайме и возвращает опционал,as!при промахе роняет приложение;someиany: непрозрачный типsome Viewскрывает конкретный тип от вызывающего, но не от компилятора. Экзистенциалany Protocolупаковывает значение в контейнер и вызывает методы через таблицу свидетелей протокола;- диспетчеризация: структуры и
final-методы вызываются статически, методы классов по умолчанию идут через vtable, а@objc dynamicотдаёт вызов в рантайм Objective-C, что нужно для KVO и свиззлинга. Типизация от этого остаётся статической.
Хорошо назвать и цену: длинные выражения с литералами и перегруженными операторами тормозят проверку типов, и компилятор может сдаться с ошибкой unable to type-check this expression in reasonable time. Помогает явная аннотация или разбиение выражения.
Где спотыкаются
Считают, что раз тип можно не писать, язык динамический. Вывод типов работает только при компиляции, и присвоить строку переменной типа Int нельзя.
Путают типизацию с диспетчеризацией и называют dynamic признаком динамической типизации. Это про способ вызова метода, а не про проверку типов.
Приводят Any и as! как пример гибкости. На собеседовании это скорее минус: форс-каст переносит ошибку типов из компилятора в краш у пользователя.