第3章 数据集装箱——数据类型
本章教学录像:1小时44分钟
数据是计算机存储和处理信息的载体,而数据类型是为了规范数据存储和运算方式所提供的语法特性。本章来学习Swift编程语言的数据类型。
本章要点(已掌握的在方框中打勾)
□ 常量与变量
□ 常量与变量的声明
□ 数值类型
□ 数据类型的标注
□ 常量与变量的输出
3.1 常量与变量
本节视频教学录像:18分钟
任何一种编程语言都会用到数据,而用来指代数据的值又有变和不变之分。常量,就是表示一些固定的数据,也就是不能改变的数据。反之,能改变的数据的值称为变量。
3.2 常量与变量的声明
本节视频教学录像:23分钟
在程序执行期间,不可以改变的量,称之为常量。相反,在程序执行过程中,其值可以任意改变的量称之为变量。常量和变量一样,在使用之前都要进行声明和定义。
3.2.1 常量的声明
常量的值在编译时不需要指定,但至少要赋值一次。常量声明语法如下。
let 常量名:数据类型=值
在语法结构中,let是定义常量的关键字;“常量名”是常量的名称(常量名必须符合命名规范);“数据类型”是常量的数据类型,如果常量被赋初始值的话,可以省略数据类型,数据类型相关的知识会在下面的章节中讲到;“值”是指常量所被赋予的值。
【范例3-1】声明常量。
使用let关键字声明一个值为10的常量a,其程序代码如下。
01 import Foundation //引用Foundation
02 let a= 10 //声明一个名称为a的常量,并为它赋值为10
03 println(a) //输出常量
运行结果如下。
常量的属性决定了常量一旦赋值后就不能进行二次赋值了,否则就会报错。试将本例中的常量值改变一下。
01 import Foundation //引用Foundation
02 let a= 10 //声明一个名称为a的常量,并为它赋值为10
03 a= a-5 //改变常量a的值
04 println(a) //输出常量
运行时会出现如下的错误提示。
Cannot assign to 'let' value 'a' //不能指定常量a的值
3.2.2 变量的声明
变量的特性就是可以多次改变值。在程序执行期间,变量的值可以随意改变。变量声明语法如下。
var 变量名:数据类型=值
在语法结构中,var是定义变量的关键字;“变量名”是变量的名称(变量名必须符合命名规范);“数据类型”是变量的数据类型,如果变量被赋初始值的话,可以省略数据类型,数据类型相关的知识会在下面的章节中讲到;“值”是指变量所被赋予的值。
【范例3-2】声明变量。
使用var关键字声明一个值为80的变量b,其程序代码如下。
01 import Foundation //引用Foundation
02 varb= 80 //声明一个名称为b的变量,并为它赋值为80
03 println(b) //输出常量
运行结果如下。
变量不同于常量,它的值可以随意修改。下面我们将变量重新赋值,程序仍能正常的执行,具体程序代码如下。
01 import Foundation //引用Foundation
02 varb= 80 //声明一个名称为b的变量,并为它赋值为80
03 b=b-20 //改变变量b的值
04 println(b) //输出变量
运行结果如下。
3.2.3 声明的注意事项
下面将从3个方面来讲述常量和变量在命名过程中需要注意的事项。
1.宽松的命名方式
在Swift中,对常量和变量名称的要求非常宽松。基本可以使用自己喜欢的任何一种形式来命名常量和变量,可以采用数字、汉字甚至是图像符号等。
01 let π= 3.1415926
01 var 你好="您好"
02 let §§§§="符号"
在上述代码中,我们可以发现在常量和变量的名称中可以使用数学符号、汉字以及特殊符号等来命名常量和变量。
2.关键字不能命名常量和变量
虽然常量和变量名称的要求很宽松,但是在声明常量和变量时不能直接使用Swift关键字。如果使用关键字作为常量或者变量的名称,程序会出现错误。如在下面的程序中,采用for作为变量的名称,代码如下。
01 import Foundation //程序头
02 var for= 80 //声明一个名称为 for的变量,并为它赋值为80
03 println(b); //输出变量
运行时会出现如下的错误提示。
keyword 'for' cannotbe used as identifier //关键字 for不能用作标识符
3.同行声明多个常量和变量
在Swift语言中,允许声明多个常量或者变量在同一行上。
【范例3-3】一行声明多个常量和变量。
在一行代码中声明多个常量或者多个变量,需要用逗号隔开。
01 let a= 1,b= 2, c= 3 //一次声明3个名称为a、b、c的新常量,并为它赋值分别为1、2、3
02 var x= 4, y= 5, z= 6 //一次声明3个名称为x、y、z的新变量,并为它赋初始值分别为4、5、6
提示
如果你的代码中有不需要改变的值,请使用let关键字将它声明为常量。只将需要改变的值声明为变量即可。
3.3 数据类型
本节视频教学录像:52分钟
数据类型是所有编程语言都具有的,当然在Swift编程语言中也不例外。如在Swift中,简单的数据类型包括整型、浮点类型、字符型及字符串类型等。
3.3.1 整数类型
整数是指没有任何小数部分的数字,比如6、27、109、256、-10、0、-289等数值。整数根据有无符号又可分为有符号(正、负、零)整数或者无符号(正、零)整数。根据位数不同,在Swift中整数又分为8位、16位、32位和64位的有符号和无符号整数类型。这些整数类型的命名方式和C 语言很像,比如8位无符号整数类型是 UInt8,32位有符号整数类型是Int32。就像Swift 的其他类型一样,整数类型采用大写命名法。
1.整数的边界范围
Int8、UInt8等都是整数类型。由于位数不同,可以通过min和max属性来获取对应类型的最大值和最小值的边界范围。
【范例3-4】声明整型常量范围。
定义整数常量,并输出常量的范围。
01 letminValue1=UInt8.min //minValue1为 0,是UInt8类型的最小值
02 letmaxValue1=UInt8.max //maxValue1为 255,是UInt8类型的最大值
03 letminValue2=Int8.min //minValue2为-128,是 Int8类型的最小值
04 letmaxValue2=Int8.max //maxValue2为127,是 Int8类型的最大值
05 println(minValue1)
06 println(maxValue1)
07 println(minValue2)
08 println(maxValue2)
运行结果如下。
不同整数的边界范围如下。
2.整数常量的长度
一般来说,不需要专门指定整数的长度。Swift提供了一个特殊的整数类型Int,其长度与当前平台的原生字长相同。
●在32位平台上,Int和Int32长度相同。
●在64位平台上,Int和Int64长度相同。
除非需要特定长度的整数,一般来说使用Int就够了。这可以提高代码的一致性和复用性。即使是在32位平台上,Int可以存储的整数范围也可以达到-2147483648~2147483647,大多数时候这已经足够大了。
3.无符号类型整数常量
Swift也提供了一个特殊的无符号类型UInt,其长度与当前平台的原生字长相同。
-在32位平台上,UInt和UInt32长度相同。
-在64位平台上,UInt和UInt64长度相同。
尽量不要使用UInt,除非特别需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用Int,即使需要存储的值已知是非负的。统一使用Int可以提高代码的利用率,避免不同类型数字之间的转换,并且匹配数字的类型推测。
无符号整型和有符号整型常量的声明语法如下。
let 常量名:UInt=值
let 常量名:Int=值
在语法结构中,let是定义常量的关键字;“常量名”是常量的名称;“:UInt”和“:Int”是定义常量的类型;“值”是指变量所被赋予的值。
无符号整型和有符号整型变量的声明语法如下。
var 变量名:UInt=值
var 变量名:Int=值
在语法结构中,var是定义变量的关键字;“变量名”是变量的名称;“:UInt”和“:Int”是定义常量的类型;“值”是指变量被赋予的值。
【范例3-5】声明UInt和Int类型的常量与变量。
使用UInt和Int类型的常量与变量,并输出结果。
01 letUmyxx:UInt= 900 //声明定义一个数据类型为无符号整型的常量,并赋值为900
02 letUmyZZ:Int= 700 //声明定义一个数据类型为有符号整型的常量,并赋值为700
03 var Imyxx:UInt= 200 //声明定义一个数据类型为无符号整型的变量,并赋值为200
04 var ImyZZ:Int= 500 //声明定义一个数据类型为有符号整型的变量,并赋值为500
05 println(Umyxx) //输出
06 println(UmyZZ)
07 println(Imyxx)
08 println(ImyZZ)
运行结果如下。
3.3.2 浮点类型
浮点类型数据和整数类型的数据刚好相反,浮点类型是指具有小数部分的数字。比如0.23、3.1415926等。另外,浮点类型所表示的范围比整数类型表示的范围更广,并且可以存储的数据也更大或更小。Swift 提供了Double和Float两种数据类型。
1.Double高精度浮点
Double表示 64 位浮点数,其实就是小数。比如5.43、-2.3、0.0等,另外0.0也算是个小数。当需要存储很大或者需要很精确时,可以使用64位浮点数。使用Double声明定义常量变量的语法形式如下。
let 常量名:Double=值
var变量名:Double=值
2.Float单精度浮点
Float表示 32 位浮点数,精度要求不高的话可以使用此类型。也就是说,它所能表示的小数位数比较少。
浮点数是有小数部分的数字,比如 3.14159、0.1和-273.15。
使用Float声明定义常量变量的语法形式如下。
let 常量名:Float=值
var变量名:Float=值
3.3.3 字符类型
在Swift中,提供了一种用于文本使用的类型,即字符类型(Character)。字符类型可以声明具有字符类型的常量或变量。字符类型的声明语法如下。
let 常量名:Character ="值"
var变量名:Character ="值"
【范例3-6】声明字符类型的常量与变量。
使用Character声明字符类型的常量与变量,并输出结果。
01 import Foundation
02 letCharmya:Character="A" //声明定义一个数据类型为字符类型的常量,并赋值为A
03 varCharmyb:Character="B" //声明定义一个数据类型为字符类型的变量,并赋值为B
04 println(Charmya) //输出
05 println(Charmyb)
运行结果如下。
将一个数字(0~9)、英文字母(a~z、A~Z)或者其他符号(+、-、!、?等)用双引号括起来,这样构成的就是字符常量。比如"6"、"a"、"F"、"+"、"$"等。另外双引号只能括住1个字符,而且不能是中文字符,下面的写法是错误的:"abc"、"123456"、"男"。如下所示的代码中在双引号中放入2个字符,在程序运行时就会报错。
01 letCharmya:Character= "AB"
02 varCharmyb:Character= "123"
03 println(Charmya)
04 println(Charmyb)
3.3.4 字符串类型
将多个字符用双引号("")括起来,这样就构成了字符串类型。比如"16"、"男女"、"哇哈哈"、"abcd"、"my_car4"等。在Swift中,声明字符串类型的常量或者变量需要使用到字符串类型String。字符串类型的声明语法如下。
let 常量名:String ="值"
var变量名:String ="值"
【范例3-7】声明字符串类型的常量与变量。
使用String声明字符串类型的常量与变量,并输出结果。
01 import Foundation //程序头
02 let strmya:String="Hello" //声明定义一个数据类型为字符串类型的常量,并赋值为Hello
03 var strmyb:String="Swift" //声明定义一个数据类型为字符串类型的变量,并赋值为Swift
04 println(strmya) //输出
05 println(strmyb)
运行结果如下。
3.3.5 布尔类型
布尔(Boolean)类型用于表示布尔逻辑量,布尔类型又叫作Bool。布尔值是指逻辑上的真假,因为它们只能是真或者假两个值。所以Swift有两个布尔常量值true和false。
01 let orangesAreOrange= true
02 let turnipsAreDelicious= false
其中orangesAreOrange和 turnipsAreDelicious的类型会被Swift编译器推测为布尔类型,因为它们的初始值是布尔类型量。就像之前提到的 Int和Double一样,如果你创建变量的时候给它们赋值 true或者 false,那就不需要将常量或者变量声明为Bool类型。初始化常量或者变量的时候如果所赋的值类型已知,就可以利用编译器的类型推测来得到数据的类型。布尔类型的常量和变量可以通过Bool进行声明定义,其语法如下。
01 let常量名 :Bool=值
02 var变量名 :Bool=值
【范例3-8】声明布尔类型的常量与变量。
使用Bool声明布尔类型的常量与变量,并输出结果。
01 import Foundation //程序头
02 letboolmya:Bool=true //声明定义一个数据类型为布尔类型的常量,并赋值为 true
03 varboolmyb:Bool=false //声明定义一个数据类型为布尔类型的变量,并赋值为 false
04 println(boolmya) //输出
05 println(boolmyb)
运行结果如下。
提示
布尔类型在声明定义常量和变量时所赋的值必须是true或者false,如果出现其他内容,程序就会出现错误。
3.3.6 可选类型
在Swift中还有一种用来处理值可能缺失的情况,如值存在就输出值,如果不存在就返回一个nil(nil表示无值,任何变量在没有被赋值之前的值都可以赋值为nil;对于真假判断,只有nil与false表示假,其余均为真),表示一种可选值,称之为可选类型。
可选类型是Swift专用的类型。可选类型常量和变量的声明定义是使用问号(?)来实现的,其语法如下。
01 let常量名 :数据类型?
02 var变量名 :数据类型?
【范例3-9】声明可选类型的常量与变量。
使用?声明可选类型的常量与变量,并输出结果。
01 import Foundation //程序头
02 let x:Int? //声明定义一个数据类型为可选类型的整数常量
03 var y:Int? //声明定义一个数据类型为可选类型的整数变量
04 println(x) //输出
05 println(y)
运行结果如下。
由于在声明可选类型常量和变量时并没有对其赋值,所以在输出时根据可选类型的特性输出为空值。
3.4 数值类型的标注
本节视频教学录像:2分钟
在声明常量或者变量的时候可以加上类型标注(type annotation)来说明常量或者变量中要存储的值的类型。如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。
varwelcomeMessage:String //声明一个类型为String,名字为welcomeMessage的变量
本例为welcomeMessage变量添加了String类型标注,表示这个变量可以存储“字符串”类型的值。声明中的冒号代表着“是……类型”,“类型为String”的意思是“可以存储任意String 类型的值”。
另外,welcomeMessage变量现在可以被设置成任意字符串,如:
varwelcomeMessage= "Hello" //welcomeMessage变量被设置成Hello字符串
一般来说很少需要写类型标注。如果在声明常量或者变量的时候赋了一个初始值,Swift则可以推断出这个常量或者变量的类型。在上面的例子中,没有给 welcomeMessage 赋初始值,所以变量welcomeMessage 的类型是通过一个类型标注指定的,而不是通过初始值推断的。
3.5 常量和变量的输出
本节视频教学录像:9分钟
在Swift编程语言中,提供了用 println 函数来输出当前常量或变量的值。
【范例3-10】使用println函数输出变量值。
01 var friendlyWelcome= "Hello!" //将变量 friendlyWelcome命名为Hello!
02 friendlyWelcome= "Bonjour!" //变量 friendlyWelcome现在的值为Bonjour!
03 println (friendlyWelcome) //在输出内容最后换行输出 "Bonjour!"
输出结果如下。
println是一个用来输出的全局函数,输出的内容会在最后换行。如果你用Xcode,println将会输出内容到“console”面板上。(另一种函数叫 print,唯一的区别是在输出内容最后不会换行。)println函数输出传入的字符串String值。
【范例3-11】使用print函数输出变量值。
01 var friendlyWelcome= "Hello!" //将变量 friendlyWelcome命名为Hello!
02 friendlyWelcome= "Bonjour!" //变量 friendlyWelcome现在的值为Bonjour!
03 print (friendlyWelcome) //在输出内容最后不换行输出 "Bonjour!"
输出结果如下。
Swift用字符串插值(string interpolation)的方式把常量名或者变量名当作占位符加入到长字符串中,Swift会用当前常量或变量的值替换这些占位符。具体是将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义。
01 println ("The current value of friendlyWelcome is \(friendlyWelcome)")
02 //输出 "The current value of friendlyWelcome isBonjour!"
输出结果如下。
3.6 语法速查
声明常量或者变量,并指定其数据类型。
常量:letname:Int=123 声明一个 Int型的常量
letname:Double=123.0 声明一个Double型的常量
letname:Float=123.0 声明一个Float型的常量
letname:Character= "1" 声明一个Character型的常量
letname:String= "123" 声明一个String型的常量
letname:Bool= true/false 声明一个Bool型的常量
letname:Float? 声明一个可选型的常量
变量:varname:Int=123 声明一个 Int型的变量
varname:Double=123.0 声明一个Double型的变量
varname:Float=123.0 声明一个Float型的变量
varname:Character= "1" 声明一个Character型的变量
varname:String= "123" 声明一个String型的变量
varname:Bool= true/false 声明一个Bool型的变量
varname:Float? 声明一个可选型的变量
3.7 习题
一、选择
1.Swift中声明常量的关键词是( )。
A. int
B. let
C. var
D. char
2.下列类型中,哪一个不属于整数类型( )。
A. Int
B. UInt
C. Float
D. Int32
3. 在Swift中,输出一行自动换行的内容需要用到的函数是( )。
A. printf
B. println
C. print
D. NSLog
4.下列选项中,不是合法的变量名的是( )。
A. test
B. _moment
C. Int
D. test1
5.下列选项中,哪一个是正确的赋值语句( )。
A. a==2
B. a:2
C. a->2
D. a=2
二、填空
1.布尔类型的值只有______和______两种情况。
2.“=”在Swiftt中的作用是______。
3.声明可选类型时,用到的关键字是______。
三、程序题
1. 声明一个常量,定义其类型为Int,为其赋值为5,并输出这个常量的值。
2. 声明一个变量,定义其类型为String,为其赋值为“string”,并输出这个变量的值。
3. 声明一个变量,定义其类型为Bool,为其赋值为true,并输出这个变量的值。然后尝试为这个Bool变量赋值为1,看看会出现什么情况。