在 Swift 语言简明教程(三) - 控制语句 中, 我们了解了 Swift 中的控制语句,这次我们来学习一下 Swift 中的两个特殊数据类型 - 元组与可选型
在Swift 语言简明教程(一) - 数据类型 ,我们介绍了 Swift 中内置类型系统中的几个基本类型,那些都是在其它高级语言中有的部分,只是具体的关键字,取值范围有所不同。但今天要介绍的的类型是在其它高级语言中比较少见,通常出现在动态解释型语言中。
元组型(Tuple)
把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。这个类型很像C/C++中的结构体(struct)。但定义,使用起来更简单。
元组的定义
下面来看一个官方文档中的例子:
1 | let http404Error = (404, "Not Found") |
这个例子中,(404, “Not Found”) 是一个描述 HTTP 状态码(HTTP status code)的元组。HTTP 状态码是当你请求网页的时候 web 服务器返回的一个特殊值。如果你请求的网页不存在就会返回一个 404 Not Found 状态码。
(404, “Not Found”) 元组把一个 Int 值和一个 String 值组合起来表示 HTTP 状态码的两个部分:一个数字和一个人类可读的描述。这个元组可以被描述为“一个类型为 (Int, String) 的元组”。
当然,对于上面的内容,我们还可以采用不同的定义方式,如:
1 | let http404Error = (errCode: 200, errMessage: "Not Found") |
当然也可以这样定义:
1 | let http404Error:(errCode:Int, errMessage: String) = (404, "Not Found") |
上面的定义中,明确指明了元祖中每个元素的类型和名称。
元组赋值
我们可以直接将一个元组赋值给一个变量,如:
1 | let http404Error2 = (errCode: 200, errMessage: "Not Found") |
当然,只要元素的类型相同,也可以将元素没有命名的元组赋个元素命名的元祖,比如:
1 | let http404Error = (404, "Not Found") |
注意,这是赋值给一个匿名的元祖, 赋值以后, code 和 message 可以作为单独的变量进行存取
在上面的例子中,如果对于 “code“ 不感兴趣,也可以将 code 省略,并用占位符: “_” 占位。 如:
1 | let http404Error = (404, "Not Found") |
取元素的值
如何取元组中元素的值呢? 有几种方法:
- 如果元组中的元素为匿名,可以采用序号,如:
1 | let http404Error = (404, "Not Found") |
- 如果是命名的元素,可以使用名字来存取,如:
1 | let http404Error2 = (errCode: 200, errMessage: "Not Found") |
可选型
可选型为了帮助程序员处理常见的空指针错误而设计的。在 C/C++ 中没有类似的语言机制,Java 语言在 Java 8 中开始提供一个可选类型(Optional),就和这个类似。 但 Swift 中的语法要显得更简单一些。
要理解可选型,首先要理解 Swift 中的空值。
在 Swift 中,一个变量(无论它的类型是什么)若没有值,可以用 “nil” 表示。 但在默认情况下,我们用 “var” 关键字定义出来的变量在使用前都必须要赋初值,否则编译器会报错,如:
1 | var myName: String |
以上代码是无法通过编译的,但如果赋了初值就正确了。
1 | // var myName = "tom" --也可以在定义是直接赋初值 |
但如果一个变量在某些情况下就是没有值,也就是变量允许为 nil(nil 不是指针——它是一个确定的值,用来表示值缺失), 要怎么做呢? 这时候就需要用到可选型了。
定义可选型
在 swift 中,声明可选性很简单,只需要在具体类型后面加上一个“?”号即可,让我们改造上面的例子:
1 | var myName: String? |
现在,代码可以通过编译了,但仍有警告。 因为对于可选型的变量,直接存取它的值是有风险的(可能没有值)。
存取可选型变量的值
为消除警告(当然,警告也是告诉我们程序可能存在潜在的问题),要存取可选型变量的值,需要首先判断其值是否为空,然后再用 “!” 操作符进行存取,写起来就是这样:
1 | var myName:String? = "tom" |
当然,也可以进行赋值
1 | var myName:String? = "tom" |
这样写起来比较麻烦,所以 Swift 等于了一个特殊的 if 语句,比如上面的例子,可以这样写:
1 | var myName:String? = "tom" |
直接判断和赋值,这样在使用时就不用再使用 “!” 号。
这种表达方式也可以包括变量值为空的情况,还是上面的例子:
1 | var myName:String? |
该 if 语句还可以同时包括多个可选型的变量和逻辑判断,表达式之间用”,”号进行分割,如:
1 | var obj1:Int? = 1 |
下一步
接下来,我们将简要的介绍 Swift 中的集合类型 - 列表(Array)。