Swift 4 Introduction系列1.3 — Swift基本数据类型

Swift鼓励程序员使用4种基本数据类型。 它们是String,Int,Double和Bool

字符串用于文本,整数用于整数, 精度型用于浮点数, 布尔型用于存储布尔值(真或假)。

除了4种基本数据类型外,我们还可以使用UInt表示的无符号整数Float表示的较小浮点数

对于有符号和无符号整数,都可以将它们分解为位大小的整数。 一个八位带符号整数由Int8表示。 对于有符号整数,我们有Int8Int16Int32Int64 。 同样,对于无符号整数,我们也有UInt8UInt16UInt32UInt64

整数,浮点数和布尔值的实现与许多其他C类编程语言(例如C,C#或Objective-C)非常相似。 使用不同的编程语言,String的实现将有所不同。 在本文中,我们将介绍String的基础知识。

在本文中,我们还将介绍与其他编程语言不太相同的新数据类型。 元组是包含一组值的数据类型。 可以使用其他基本数据类型的组合来构造这些值。 我们可以将多个值组合成一个元组,并像处理单个变量一样传递多个值。 (提示:对于C编程,元组类似于struct)。

Swift还引入了一种称为Optionals数据类型的数据类型。 可选变量处理变量中没有值的情况。 它类似于Objective-C中的nil指针,但可选选项适用于所有Swift数据类型。 可选参数比Objective-C中的nil指针安全。 通过使用if语句和可选变量,Swift引入了一种称为可选绑定的编程技术,该技术可对所有变量进行安全检查。 可选绑定是Swift编程的关键功能之一。

整数

在Swift中, 整数整数 。 整数数据类型仅接受整数。 例如,整数接受数字,例如54或57791。

整数可以进一步分为有符号整数无符号整数 。 有符号整数接受负整数和正整数。 有符号整数的示例是57,-325和-54623。 无符号整数仅接受正整数,例如723和9394。

有符号整数用Int表示,无符号整数用UInt表示。

另外,Swift还提供位大小的整数。 UInt8表示大小为8位的无符号整数。 Swift提供了4个无符号位整数,它们是UInt8UInt16UInt32UInt64 。 位大小越大,可容纳的数字越大。 例如,UInt8仅接受0到255之间的数字,而UInt64可以接受0到18446744073709551615之间的数字。

类似地,Swift还提供了4个有符号位大小的整数,它们是Int8Int16Int32Int64 。 对于有符号整数,它只能容纳无符号整数大小的一半。 这是因为有符号整数也接受负数。 有符号整数接受1和-1。 因此,Int8只能接受-128到127之间的数字。

总而言之,我们有以下类型的整数。 Int,UInt,Int8,Int16,Int32,Int64,UInt8,UInt16,UInt32和UInt64

在讨论这些整数之前,我们需要讨论构成整数原始数据的数字文字。

数字文字

在开始讨论整数和浮点数之前,我们应该研究数字文字。 在编程中,数字文字是原始形式的数字,例如254,-58、2.655。

在Swift中,我们接受不同形式的数字文字。 除了十进制数字,Swift还接受二进制,十六进制和八进制形式的数字。 为了区分小数和其他形式的数字,我们必须包括以下数字类型的前缀:

 二进制:0b 
十六进制:0x
八进制:0o

例如,数字255可以用以下格式编写,并且在Swift中是可接受的:

 十进制255 
二进制0b1111 1111
十六进制0xFF
八进制0o377

我们可以使用这些数字形式声明常量或变量。

 让常数AA = 255 
var variableBB = 0b11111111
让常数CC = 0xFF
var variableDD = 0o377

我们还可以在计算过程中混合使用不同的数字形式

 让常数EE = 255 + 0b11111111 + 0xFF + 0o377 
让常数FF = 255 + 255 + 255 + 255

我们还可以使用字符串插值在打印语句中包括不同的数字形式:

  print(“ 0xFFFF的数量为\(0xFFFF)。”) 

我们通常不使用其他数字形式作为数据输入。 如果我们需要对某些需要其他数字形式的功能进行编程,则可以使用它们。

对于我们的大多数编程功能,我们都坚持使用十进制形式。

此外,我们还可以使用下划线(_)拆分大数字以提高可读性。 例如,100亿就是10,000,000,000。 我们可以用10_000_000_000表示数字。

接下来,我们将在了解UInt和Int之前探索位大小整数。

基于位的整数

基本上我们有8种类型的整数,4种有符号整数和4种无符号整数。 它们是Int8,Int16,Int32,Int64,UInt8,UInt16,UInt32和UInt64

有什么区别? 主要区别在于它们的位大小。 UInt8只有8位长,而UInt64是64位长。 位大小越大,可以存储的数字越大。 例如,UInt8可以存储0到255之间的数字,而UInt32可以存储0到4294967295之间的数字。

对于带符号整数,我们可以存储更少的数字,因为我们需要考虑负数。 Int8需要接受1和-1。 因此Int8可以接受-128到127之间的数字。因此,对于有符号整数,存储能力几乎减少了一半。

下面列出的表列出了每个整数可接受的数字:

从表中可以看出,位大小越大,变量中可容纳的数字越大。

声明的基于位的整数

要声明位大小的整数,我们必须包括数据类型注释,因为如果没有数据类型注释,系统将推断整数为Int而不是Int16。

数据推断不适用于位大小整数。

语法如下:

让: =

要么

var : =

请参考下面的例子。

例:

 让minimumNumber:Int8 = 127 
var smallNumber:Int16 = 32767
让bigNumber:UInt32 = 4294967295
var GreaterNumber:UInt64 = 18446744073709551615

使用位大小整数

除非需要在所有不同平台(32位系统和64位系统)上以特定大小固定的常量或变量,否则我们通常不声明位大小为整数。

为了找出整数类型可以接受的最大数或最小数,我们在数据类型后附加.min(最小数)和.max(最大数)。

请参见以下示例:

 设minOfInt8 = Int8.min 
让maxOfInt8 = Int8.max
 让minOfUInt64 = UInt64.min 
//对于无符号整数,最小值始终为0
 让maxOfUInt64 = UInt64.max 

除非在特殊情况下,否则我们不应该使用位整数。 我们应该使用默认的带符号整数(Int)。 即使我们正在处理不超过100个很小的数字,也不应使用Int8或UInt8。 与使用Int相比,使用Int8没有提供任何优势。

在过去内存不足的时代,使用Int8很有意义,这样我们可以节省内存。 使用Int8也不会提高处理速度,实际上,由于大多数操作系统针对64位CPU操作进行了优化,因此它可能会降低处理速度。

无符号整数

如前所述,无符号整数仅接受正数。 无符号整数由UInt表示。 但是UInt有多大? 好吧,UInt会根据操作环境(尤其是CPU大小)而变化。

  • 如果计算机在32位处理器上运行,则UInt等效于UInt32。
  • 如果计算机在64位处理器上运行,则UInt等效于UInt64。

从MacBook到iPad的所有Apple设备均由不同的处理器运行。 现在,所有现代Apple产品(Apple Watch除外)都可以在64位处理器上运行。 但是,较早的Apple设备可能在32位处理器上运行。

如果我们的应用程序要在32位和64位平台上运行,那么我们需要找出特定平台的UInt限制。 类似地,我们可以通过将.max附加到UInt来找出最大值

从结果中,我们得出UInt等同于UInt64。

当我们开发适合于较老一代iPad或Apple Watch的应用程序时,请注意这一点。

要使用无符号整数,我们必须使用数据类型注释声明。 数据类型推断不适用于无符号整数。

语法如下:

let :UInt =

要么

var :UInt =

范例1:

 让someUnsignedNumber:UInt = 787 

范例2:

  var someUnsignedVariable:UInt = 54 
someUnsignedVariable = 768
print(“未签名的数字为\(someUnsignedVariable)。”)

通过在括号内插入常量或变量,可以使用打印功能来打印无符号整数。

我们还可以通过字符串插值打印无符号整数。

Swift鼓励我们使用默认的带符号整数,以提供更好的代码互操作性。 除非我们需要运行一个大数字并且该数字超过有符号整数的最大限制,否则我们不应该使用无符号整数。

即使我们仅使用正数,也建议使用默认的Int。 使用Int可以提高代码的互操作性,并防止我们在不同的整数之间进行转换。

如上一节所述,使用UInt不会提高处理效率以提高效率。 仅当我们需要的数字大于有符号整数可以接受时,才使用UInt。

签名整数

同样,有符号整数也可以从我们的CPU大小得出。

  • 如果计算机在32位处理器上运行,则Int等效于Int32。
  • 如果计算机在64位处理器上运行,则Int等效于Int64。

要找出最大和最小限制,我们可以通过添加.max和.min来实现。

 设minLimitInt = Int.min 
让maxLimitInt = Int.max

有符号整数(Int)是数据类型推断的默认值。 任何整数都会自动推断并分配为Int数据类型。 因此,在声明常量或变量时,我们不必包含数据类型注释。

为了实现更好的代码互操作性,即使我们仅使用正数,也应尽可能使用Int。

整数溢出

熟悉Objective-C或C编程的读者应该知道,如果我们将1加到最大限制,则整数变量将溢出。 在Swift中,没有整数溢出。 如果我们将1加到最大值,只会产生错误。

浮点数

浮点数是小数十进制数。 例如,3.1415、0.22和-5.23都是浮点数。 也建议使用浮点数进行除法,除非我们要舍弃余数。

在Swift编程中,浮点数由2种数据类型表示。 它们是Double和Float。 Double是一个64位浮点数,精度至少为15个小数位,而Float是一个32位浮点数,精度为6个小数位。

另请注意,浮点数不受CPU位大小的限制。 通常由浮点单元(也称为协处理器或数学处理器)计算。

浮点文字

对于浮点数,可以用前缀为0x的十进制文字和十六进制文字表示。

十进制数字的浮点字面量必须有一个小数点,小数点两边都有数字。

例如,数字132将推断为Int。 为了让系统将数字推断为浮点数,我们必须将132写入132.0。

此外,我们还可以将E或e包含在指数中。 要写一个带指数的数字,数字255可以写成2.55 x10²。 在Swift编程中,我们可以使用E或e以指数形式写数字来表示x10。 E或e之后的数字是指数。 我们可以使用E或e,因为它们表示相同的事物。

例如,可以将2.55 x10²写成2.55e2。

例子:

 令fpLiteral2 = 3.1415 
 令fpLiteral3 = 2.55e2 
 令fpLiteral4 = 2.55E2 
 让fpLiteral5 = 25.64E4 

更多示例:

  //十进制:使用e表示指数 
令val22 = 2.1718
令val23 = 0.021718e2
令val24 = 217.18e-2

浮点数也可以用十六进制形式表示。 要以十六进制形式写浮点数,我们必须以0x作为前缀。 另外,我们需要使用p作为指数而不是e以指数形式编写。 P由2exp表示。 在这种情况下,exp可以用十进制表示。 因此,p之后的数字必须为十进制。

例如,对于255可以写为0xFFp0。 数字0xFFp3等于255 x 23 = 2040。

附加示例:

  //十六进制:使用p表示指数 
令val25 = 0xFFp2
令val26 = 0xFFp1
令val27 = 0xFFp0
令val28 = 0xFFp-1
令val29 = 0xFFp-2

更多示例:

  //更多示例:以下所有数字文字都引用相同的数字。 
令val30 = 12.1875
令val31 = 1.21875e1
令val32 = 0xC.3p0

我们还可以使用下划线将小数位拆分为更易读的部分。

例:

  //我们可以使用_并填充0以提高可读性 
令val34 = 000223.000655
令val35 = 000_223.000_655

浮动

浮点数是一个32位浮点数,其精度限制为6个小数位。 由于Float的精度有限,因此除非绝对必要,否则不建议使用它。

要声明Float常量或变量,我们需要包括数据类型注释。 数据类型推断不适用于Float。

语法如下:

let :浮点数=

要么

var :浮点数=

例:

 让shortPi:Float = 3.14159265359 
 让longPi = 3.14159265359 

如前所述,Float具有有限的精度。 如果我们输入一个十进制数字长的十进制数字,它将四舍五入到最接近的6个小数位。

如果我们正在计算的数字不超过2个小数位,那么使用Float效率更高? 答案是没有必要的,因为如今的内存负担得起,因此如果坚持使用Float,我们将不会节省太多的内存空间。 CPU执行是一个复杂的过程,因此使用Float可能不一定有助于更快地执行。 甚至有额外的等待周期,它甚至可能减慢执行速度。

Double是64位浮点数,精度至少为15个小数位。 这是十进制数字的推荐数据类型。

要声明带有数据分配的常量或变量,我们不需要包含数据类型注释,因为系统会将任何十进制数字推断为Double。

语法如下:

让 =

要么

var =

例:

 让someFPNumber = 2.1718 
 令pi = 3.1415 
 设半径= 1.2 

在Swift中, String是处理文本的数据类型。 这是最常用的数据类型。 Swift还包括一个称为Character的数据类型,该数据类型包含一个字符。 本节将简要讨论基本功能。 有关更全面的检查,请参阅“使用字符串”一章。

字符串文字基本上是Swift可以接受的原始文本。 Swift可以接受unicode中的各种文本,但反斜杠(\),双引号(“)和三重双引号(”“”“)除外。

双引号用于将文本括起来,并且它是标记文本的开始和结束的标记。 三重双引号用于将文本括在多行文本中。

例:

  “这是一段文字” 
  “!@#$%^&*()_ + =-:';> <?,。/ | {} []” 

在Swift 4中,String支持多行文字。 要创建多行文字,我们使用三重双引号将整个文本括起来。 多行字符串的开头必须在开头的三重双引号之后以新行开始。

例:

 让故事=“”“ 
标题
我们可以在此处添加多行文字。
 下一段 
 结束 
“”

打印(故事)

Swift可以接受unicode中的任何字符。

例:

如果我们知道unicode号,则可以使用以下语法使用unicode号:

“ \ u {}”

例:

  “ \ u {2EE5}” 
“ \ u {2F25} \ u {2F26}”

扩展的字素簇是形成字符的unicode序列。 在许多外语中,单词是由字符或笔画组合而成的。

例:

  “ \ u {110B}” 

“ \ u {1175}”

“ \ u {110B} \ u {1175}”

“ \ u {C774}”

由于我们需要用双引号或三重双引号引起来的字符串,因此不能在字符串中使用双引号或三重双引号。 为了缓解此问题,我们创建了一个由反斜杠(\)表示的转义序列。 因此,我们不能在字符串中使用双引号(“),三重双引号(”“”)和反斜杠(\)。

要使用这3个符号,我们需要使用反斜杠作为转义序列。 要在字符串中使用双引号,我们需要输入\“而不是”,类似于在字符串中使用反斜杠,我们需要输入\\而不是\。 要包含三重双引号,我们可以使用\“””或\“ \” \“。 多行文本中的双引号不需要转义序列。

创建字符串

如果我们希望字符串值保持不变且不变,则应创建一个字符串常量。

我们可以使用以下语法创建字符串常量:

让 =

例:

  let stringConstant =“这是一个字符串常量” 

如果我们想要一个字符串值,并且希望它在需要时进行更改,那么我们应该创建一个字符串变量。

可以使用以下语法创建字符串变量:

var =

例:

  var stringVariable1 =“默认字符串值” 
stringVariable1
  stringVariable1 =“新的字符串值” 
stringVariable1

我们可以通过提供双引号来创建一个空字符串:

var =“”

另外,我们也可以使用以下语法。 两种方法产生相同的效果。

var = String()

例:

  var stringVariable3 =“” 
var stringVariable4 = String()

要检查字符串常量/变量是否为空,我们使用属性isEmpty

例:

  stringVariable3.isEmpty 
stringVariable4.isEmpty
  • 我们可以使用加号(+)连接字符串。
  • 我们可以在字符串文字和/或字符串变量之间连接。

例:

  let stringSample1 =“这是一个测试。”  +“这是节理弦的第二部分” 
 打印(stringSample1) 
  • 我们还可以使用运算符(+ =)连接字符串。 使用此运算符,我们可以将新字符串附加到原始字符串中。

范例4:

  var stringSample7 =“你好,” 
  stringSample7 + =“欢迎来到星际舰队”。 
 打印(stringSample7) 

布尔型

Swift还支持布尔类型。 此数据类型标注为Bool。 与某些其他语言(例如C)不同,其中C以0表示false,而0以外的数字表示true; 在Swift中,必须明确表示是非。 真必须表示为真,假必须表示为假。

例:

 让myFact = true 
让myNonFact = false

尽管布尔数据类型已明确定义并表示为true或false。 在内部,true值的哈希值为1,false值的哈希值为0。

我们可以读取哈希值,但不能对其进行修改。 另外,使用打印功能只会打印true或false语句值。 哈希值无法打印。

例:

 让myTruth = true 
让myNonTruth = false
  myTruth.hashValue 
  myNonTruth.hashValue 
 打印(myTruth) 
 打印(myNonTruth) 

Swift中布尔运算的工作方式不同于C编程。 在C编程中,我们可以使用0和非零来表示是非。 在Swift中,我们无法将整数评估为布尔值并将其解释为布尔值。 以下语句在Swift中将失败,但是将在C中运行:

var x = 1

如果x {…}

我们需要明确地使用x == 1来评估布尔值。

 让boolTest = false 
//以下是测试布尔变量的首选方法
如果boolTest == true
{
print(“ boolTest为True”)
}
其他
{
打印(“ boolTest为假”)
}

由于布尔值是True或False,我们也可以使用以下格式而不使用比较器

 如果boolTest 
{
print(“ boolTest为True”)
}
其他
{
打印(“ boolTest为假”)
}

上面的示例起作用了,因为boolTest是一个布尔变量。

我们无法使用以下内容,请删除评论以进行测试

  / * 
放错方法1 = 1
如果不正确
{
打印(“ wrongWay1为True”)
}
其他
{
打印(“ wrongWay1为假”)
}
* /

上面的示例将产生错误,但是我们可以使用比较器测试整数,如下所示

 让rightWay1 = 1 
如果rightWay1 == 1
{
打印(“ rightWay1为True”)
}
其他
{
打印(“ rightWay1为假”)
}