Преобразование типа данных

Мы не можем выполнять вычисления для переменных с другим типом данных. Например, мы не можем добавить число с плавающей запятой (Double) к переменной, которая является целым числом (Int). Чтобы иметь возможность выполнять такие вычисления, мы должны преобразовать целое число в число с плавающей запятой. Точно так же мы не можем добавить переменную, принадлежащую типу данных Int8, с переменной UInt16.

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

let ‹имя_константы› = ‹тип данных›(‹числовые_литералы/константа/переменные›)

Or

var ‹имя_переменной› = ‹тип данных›(‹числовые_литералы/константа/переменные›)

Or

‹объявленное_имя_переменной› = ‹тип_данных_тот же_имя_переменной›(‹числовые_литералы/константа/переменные›)

Основное правило преобразования типов данных: преобразуемые данные соответствуют типу данных, в который они преобразуются.

Поэтому мы должны знать ограничение на тип данных, чтобы мы могли выполнить преобразование без ошибок.

Преобразование между битовыми целыми числами

Чтобы преобразовать между данными битового размера, нам нужно использовать приведенный выше синтаксис.

Пример:

let numberA:UInt8 = 87
let numberB:Int16 = 43
let numberC = 23
let numberD = Int16(12)
let numberE = Int32(numberA)
var numberF = UInt16(numberB)
let numberG = UInt64(numberC)
numberF = UInt16(numberD)

Как показано в приведенном выше примере, мы можем включить числовой литерал в скобку преобразования, как показано в NumberD. Чтобы переназначить переменную, нам нужно сопоставить тип данных преобразователя с переменной в левой части уравнения, как показано в numberF в последнем выражении. При объявлении обратите внимание, что переменная будет принимать любой тип данных, указанный преобразователем.

Мы также можем сначала объявить константу или переменную, а затем выполнить присваивание. Обратите внимание, что преобразователь должен иметь тот же тип данных, что и объявленная переменная или константа.

Пример:

let numberI:UInt64
numberI = UInt64(numberA)
var numberJ:Int16
numberJ = Int16(numberC)

Мы также можем выполнить вычисления, как показано ниже:

let numberH = UInt32(numberA) + UInt32(numberB) + UInt32(numberC)

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

В следующем примере мы добавляем Int8, Int16 и UInt32. Если тип данных нужного нам числа суммирования находится в операнде (в данном случае UInt32), то мы можем игнорировать преобразователь.

Пример:

let numberX:Int8 = 54
let numberY:UInt32 = 885665
let numberZ:Int16 = 2565
let numberXYZ = UInt32(numberX) + numberY + UInt32(numberZ)

Важно! Обратите внимание, что во время преобразования назначенный тип данных должен принимать преобразованное число.

Пример:

let numberK:UInt32 = 522
// The following statement will generate error since Int8 cannot accept any number larger than 128
let numberL = Int8(numberK)

Еще пример:

//: For data conversion use desiredDataType(InitialValueOrVariable)
let val36:UInt16 = 0xFFFE
let val37:UInt8 = 1
let val38:UInt16 = val36 + UInt16(val37)
//let val39 = val36 + 2 // This statement will generate error as it will exceed its maximum value
let val39 = Int(val36) + 2
// In the previous statement, we convert val36 from UInt16 to Int which allows more number.

Преобразование между целыми числами

Как обсуждалось ранее, UInt и Int зависят от возможностей процессора. Если процессор 32-разрядный, то UInt и Int совпадают с UInt32 и Int32 соответственно. Предполагая, что наш ЦП 64-битный, мы можем использовать Int64 или Int взаимозаменяемо. Однако рекомендуется придерживаться Int для совместимости.

Для преобразования между UInt и Int мы можем использовать тот же синтаксис, что упоминался ранее.

Пример:

// Convert from Int to Uint
let numberM = 21546658785652
let numberN = UInt(numberM)

Пример 2:

//Convert from UInt to Int
let numberO:UInt = 321654655
var numberP = Int(numberO)

Преобразование между числами с плавающей запятой

Для преобразования между Float и Double мы используем тот же синтаксис.

Пример:

// Convert from Float to Double
let shortDecimal1:Float = 2.658846542
let longDecimal1 = Double(shortDecimal1)

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

Пример 2:

// Convert from Double to Float
let longDecimal2 = 9.32655646655879523
let shortDecimal2 = Float(longDecimal2)

Для преобразования из длинных десятичных разрядов в короткие десятичные разряды обычно усекается длинная форма.

Преобразование чисел с плавающей запятой и целых чисел

В следующем примере демонстрируется преобразование из целого числа в число с плавающей запятой (двойное).

Пример:

// Convert from Int to Double
let number1 = 2546
let number2 = Double(number1)
print(number2)

Если мы посмотрим на результат справа, номер дисплея будет таким же. Если мы используем оператор печати, он напечатает число с .0, поскольку константа является двойной.

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

Пример:

// Convert from Double to Int
let number3 = 2.99464513
let number4 = Int(number3)
print(number4)

Преобразование данных во время вычислений

Точно так же при выполнении вычислений и преобразовании типов данных нам не нужно преобразовывать операнд, который имеет нужный нам тип данных.

Пример:

let number10 = 6
let number11 = 0.654596
let number12 = Double(number10) + number11

Еще пример:

// To perform computation with integer and floating point always convert the integer to floating point
let val40 = 2
let val41 = 0.1718
let val42 = Double(val40) + val41
// The previous statement will generate error if we do not convert val40 to Double as we cannot add Integer with Double
// The following statement produce no error because the datatype is infer during compilation time and the compiler will infer to the most appropriated type
let val43 = 2 + 0.1718

Преобразование между строкой и числами

Чтобы преобразовать текст в число, текст должен быть в правильном числе:

Пример:

// Convert from String to Double / Int
let text1 = "12.345"
let number5 = Double(text1)
let number6 = Int(text1)
let text2 = "556"
let number7 = Int(text2)

Как показано в примере выше, строку «12.345» нельзя преобразовать в Int.

Пример:

// Convert from Double / Int to String
let number8 = 256
let text3 = String(number8)
let number9 = 2.78846562
var text4 = String(number9)

Еще пример:

// To use numbers with string, we need to explicitly convert from a numeric data type to string
let myName = "Thomas"
let mySocialSecurity = 12532455
let myLine1 = myName + " Social Security number is " + String(mySocialSecurity)
// or we can string interpolation
let myline2 = "\(myName)'s Social Security number is \(mySocialSecurity)"
let hisName1 = "Steve"
let hisEarnings:Float = 145258
let myLine3 = "\(hisName1) just earned $\(hisEarnings * 0.25) for this project."

Комплексное приведение типов

Приведение типов также известно как преобразование типа данных. В следующем примере представлено подробное приведение типов для базового типа данных:

//: Comprehensive Type Casting
// Convert from strings to integer
let str1 = "9384"
let num1 = Int(str1)
num1
// Convert from integer to string
let num2 = 5478955
let str2 = String(num2)
str2
// Convert from string to 32-bit integer
let str3 = “454234”
let num3 = Int32(str3)
// Convert from default integer to 16-bit integer
let numi1 = 54
let numi2 = Int16(numi1)
// Convert from default integer to 8-bit integer
let numi3 = 12
let numi4 = Int8(numi3)
// Convert from default 8-bit integer to default integer
let numi5 = numi4
let numi6 = Int(numi5)
// Convert from default double to float
let num4 = 25.3
let num5 = Float(num4)
// Convert from float to double
let num6 = num5
let num7 = Double(num6)
// Convert from default double to integer. Please note that the decimals will be truncated.
let num8 = 32.946
let num9 = Int(num8)
// Convert from integer to double. No change in value.
let num10 = 2145
let num11 = Double(num10)
// Convert from double to string
let num12 = 32.65
let str4 = String(num12)
// Convert from string (with decimals) to float and double. Please note that float can accept fewer decimals
let str5 = "2145.3256525656"
let num14 = Float(str5)
let num15 = Double(str5)

Первоначально опубликовано на сайте blog.swifticode.com 16 апреля 2018 г.