Как реализован тип Int в Swift
iOS разработкаSwiftосновы языкапрограммированиетипы данных
Что проверяют
Понимаете ли вы, что Int в Swift это обычная структура стандартной библиотеки, а не встроенный примитив, и как язык защищает от переполнения. Следом часто спрашивают, чем Int отличается от Int64 и что будет при Int.max + 1.
Как отвечать
- устройство:
Intобъявлен какstruct, внутри одно поле со встроенным машинным целым (Builtin.Int64на 64-битных платформах). Компилятор сводит операции к инструкциям процессора, поэтому структура ничего не стоит: ни кучи, ни упаковки, ни подсчёта ссылок; - размер: равен машинному слову. На современных iPhone и Mac это 64 бита,
MemoryLayout<Int>.size == 8. Исключение, про которое мало кто помнит: Apple Watch с ABIarm64_32, тамInt32-битный. Поэтому для сериализации и форматов файлов берутInt32илиInt64явно; - протоколы: поведение задают
FixedWidthInteger,SignedInteger,BinaryInteger, а ещёHashable,Codable,Sendable. На них пишут обобщённый код для всех целых типов; - переполнение: обычные
+,-,*проверяют результат и при переполнении останавливают программу. Это происходит и в debug, и в release, проверку отключает только режим-Ounchecked; - явное поведение:
&+,&-,&*дают циклический перенос, аaddingReportingOverflow(_:)возвращает кортеж(partialValue, overflow), гдеoverflowимеет типBool; - преобразования: неявных нет.
Int(x)изDoubleотбрасывает дробную часть и падает, если значение не помещается.Int(exactly:)вернётnil, если число дробное или вне диапазона, аInt("123")возвращает опционал.
Где спотыкаются
Говорят, что переполнение ловится только в debug. В release программа тоже упадёт, и именно этим Swift отличается от C.
Не могут посчитать результат &+: для Int8 выражение 120 &+ 10 даёт -126, а не 126.
Считают Int ссылочным типом или «обёрткой над примитивом с накладными расходами». Это value type, который после оптимизации ничем не отличается от значения в регистре.