Преобразование типа данных
Мы не можем выполнять вычисления для переменных с другим типом данных. Например, мы не можем добавить число с плавающей запятой (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 г.