Основы Swift / 19.1. Дополнительная информация о целых числах


Видео


Целочисленные границы
Вы можете получить доступ к минимальному и максимальному значению каждого целого типа через их свойства min и max:
@{19.1\1}
let minValue = UInt8.min
let maxValue = UInt8.max
Значения этих свойств для целого типа верного значения (таких как UInt8 из примера выше) могут быть использованы в выражениях с другими значениями того же типа.
Приведение числовых типов
Используйте Int для всех целых чисел общего назначения в Вашем коде, даже если известно, что они будут неотрицательными. Использование целого типа по-умолчанию в повседневных ситуациях означает, что целые константы и переменные будут немедленно переносимы в Вашем коде и будут совпадать с выводимым типом для целых литеральных типов.

Используйте другие целые типы, только когда они действительно необходимы для решаемой Вами задачи ввиду явно задаваемого размера данных из внешнего источника или ввиду производительности, или ввиду потребления памяти, или другой необходимой оптимизации. Использование явно-размерных типов в этих ситуациях помогает отлавливать любые значения с непредвиденным переполнением и неявные документы с природой используемых данных.
Конвертация целых чисел
Диапазон чисел, который может быть храним в целочисленной константе или переменной различается в зависимости от численного типа. Константа типа Int8 может хранить числа между -128 и 127, тогда как UInt8 константа или переменная может хранить числа от 0 до 255. Число, которое не попадёт в границы указанного типа константы или переменной будет отмечено ошибкой в процессе сборки Вашего кода.

Так как каждый числовой тип может хранить различные диапазоны значение, время от времени Вам может потребоваться совершать преобразование типов явно. Этот путь препятствует скрытому приведению типов и возникающим из этого ошибкам, а также делает типоприведение явным в Вашем коде.
@{19.1\2}
let cannotBeNegative: UInt8 = -1
let tooBig: Int8 = Int8.max + 1
@{19.1\3}
Чтобы привести один конкретный числовой тип к другому, Вы инициализируете новое число нужного типа существующим значением. В примере ниже константа twoThousand типа UInt16, тогда как константа one типа UInt8. Они не могут быть сложены вместе напрямую, потому что они не одного типа. Вместо этого этот пример вызывает UInt16(one) для создания нового числа типа UInt16, проинициализированного значением one, и использует это значение заместо оригинала:
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne= twoThousand + UInt16(one)
Так как оба слагаемых теперь имеют тип UInt16, сложение разрешено. Результирующая константа (twoThousandAndONe) выводится в тип UInt16, так как это сумма двух значений этого типа.

SomeType(ofInitialValue) это дефолтный способ вызвать конструктор типа из Swift и передать в него инициирующее значение. За кулисами UInt16 содержит конструктор, который принимает UInt8 значение, так что это конструктор используется для создания нового значения типа UInt16 из существующего UInt8. Вы не можете передать здесь однако любой тип: это обязательно должен быть тип, для которого у UInt16 есть конструктор.
Конвертация между целыми и дробными числами
Приведение между цели и дробными числовыми типами должно так же выполняться явно:
@{19.1\4}
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
Здесь значение константы three используется для создания новой переменной типа Double, так что оба слагаемых имеют один и тот же тип. Без этого преобразования здесь сложение было бы невозможным.
@{19.1\5}
Конвертация между целым и дробным числами так же должна быть выполнена явно. Целый тип может быть проинициализирован Double или Float -значениями:
let pi = 3.14159
let integerPi = Int(pi)
Дробные числа всегда урезаются, когда используются для создания нового целого числа. Это значит, что 4.75 становится 4, а -3.9 становится -3.

Правила для объединения числовых констант и переменных отличны от таких правил для числовых литералов. Литеральное значение 3 может быть сложено напрямую с литералом 0.14159, потому что числовые литералы не имеют явного типа. Их тип будет выведен только в момент, вычисления итогового значения компилятором.