Конвертация числовых типов

Используйте тип Int для всех своих целочисленных констант и переменных, даже если известно, что они будут неотрицательными (разумеется, за исключением особых случаев). Использование стандартного целого типа в повседневных ситуациях означает, что целочисленные константы и переменные сразу могут взаимодействовать с автоподставляемым типом для целочисленных литеральных значений. (от переводчика — вообще, здесь говорится о том, что переменные становятся interoperable — в данном случае, имеется ввиду, что все наши константы и переменные, если они будут иметь тип Int, общепринятый в системе — смогут безопасно работать со всеми другими константами и переменными, зная, что они тоже Int).

Используйте другие целочисленные типы только в тех ситуациях, когда они действительно нужны для конкретной задачи, например когда используются данные с заданным размером из внешнего источника, или для производительности, уменьшения использования памяти или других оптимизаций. Использование типов с явно заданным размером в таких ситуациях позволяет поймат любые случайные переполнения данных и явно документирует природу используемых данных/значений.

Конвертация целых чисел

Диапазон чисел, которые можно хранить в целочисленной константе или переменной, отличается для

каждого типа — например, в Int8 можно хранить числа от -128 до 127, тогда как в UInt8 — числа от 0 до 255. Число, которое не помещается в диапазон приемлемых чисел, вызовет ошибку на этапе компиляции, например:

Поскольку каждый числовой тип может хранить разные диапазоны значений, вам в определенных случаях придется обращаться к явной конвертации числовых типов. Этот подход предотвращает от скрытых ошибок конвертации и позволяет ей быть явной в вашем коде.

Чтобы сконвертировать один числовой тип в другой, вам необходимо инициализировать новое число желаемого типа с использованием существующего значение. В примере ниже, константа twoThousand имеет тип UInt16, тогда как константа one имеет тип UInt8. Их нельзя напрямую добавлять друг к другу, поскольку они не одного типа. Вместо этого, мы вызываем UInt16(one), чтобы создать новое значение типа UInt16, используя значение константы one:

Поскольку оба складываемых значения в последней строчке кода имеют тип UInt16, компилятор позволяет выполнить сложение — и выходная константа twoThousandAndOne будет иметь тип UInt16 — поскольку компилятор видит, что ей присваивается значение суммы двух UInt16-констант.

SomeType(ofInitialValue) (т.е. выражение вида НазваниеТипа(начальноеЗначение) — прим. переводчика) — это стандартный способ вызвать инциализатор типа в Swift и передать начальное значение. У типа UInt16 есть инициализатор, принимающий значение UInt8, и этот инициализатор используется, чтобы создать новый UInt16 из существующего UInt8. Однако, любой тип передать не получится — только тот тип, для которого UInt16 имеет соответствующий инициализатор. Впрочем, можно использовать расширения для создания своих инициализаторов — об этом будет рассказано в главе «Расширения» на нашем сайте.

Конвертация целых чисел и чисел с плавающей точкой

Конвертация между целыми числами и числами с плавающей запятой должна быть явной:

Здесь, константа 3 используется для создания нового значения Double, таким образом в последней строке оба слагаемых имеют один тип. Без этой конвертации, сложение было бы невозможно (компилятор выдал бы ошибку).

Обратная конвертация также возможна, т.е. целочисленное значение можно инициализировать значением с плавающей точкой:

Для дробных значений, при конвертации в целое, просто отбрасывается дробная часть — т.е. 4.75 станет 4, -3.9 станет -3.

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


Просмотренно: 1 503 раз