Swift 语言简明教程(四) - 元组与可选型

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
2
3
let http404Error2 = (errCode: 200, errMessage: "Not Found")

var http404Error3 = http404Error2

当然,只要元素的类型相同,也可以将元素没有命名的元组赋个元素命名的元祖,比如:

1
2
3
4
5
let http404Error = (404, "Not Found")

var (code, message) = http404Error5

print("code is: \(code) and message is: \(message)")

注意,这是赋值给一个匿名的元祖, 赋值以后, code 和 message 可以作为单独的变量进行存取

在上面的例子中,如果对于 “code“ 不感兴趣,也可以将 code 省略,并用占位符: “_” 占位。 如:

1
2
3
4
5
let http404Error = (404, "Not Found")

var (_, message) = http404Error5

print("message is: \(message)")

取元素的值

如何取元组中元素的值呢? 有几种方法:

  1. 如果元组中的元素为匿名,可以采用序号,如:
1
2
let http404Error = (404, "Not Found")
print("code is: \(http404Error.0)")
  1. 如果是命名的元素,可以使用名字来存取,如:
1
2
let http404Error2 = (errCode: 200, errMessage: "Not Found")
print("code is: \(http404Error2.errCode)")

可选型

可选型为了帮助程序员处理常见的空指针错误而设计的。在 C/C++ 中没有类似的语言机制,Java 语言在 Java 8 中开始提供一个可选类型(Optional),就和这个类似。 但 Swift 中的语法要显得更简单一些。

要理解可选型,首先要理解 Swift 中的空值。

在 Swift 中,一个变量(无论它的类型是什么)若没有值,可以用 “nil” 表示。 但在默认情况下,我们用 “var” 关键字定义出来的变量在使用前都必须要赋初值,否则编译器会报错,如:

1
2
var myName: String
print("name is: \(myName)")

以上代码是无法通过编译的,但如果赋了初值就正确了。

1
2
3
4
// var myName = "tom" --也可以在定义是直接赋初值
var myName: String
myName = "tom"
print("name is: \(myName)")

但如果一个变量在某些情况下就是没有值,也就是变量允许为 nil(nil 不是指针——它是一个确定的值,用来表示值缺失), 要怎么做呢? 这时候就需要用到可选型了。

定义可选型

在 swift 中,声明可选性很简单,只需要在具体类型后面加上一个“?”号即可,让我们改造上面的例子:

1
2
var myName: String?
print("name is: \(myName)")

现在,代码可以通过编译了,但仍有警告。 因为对于可选型的变量,直接存取它的值是有风险的(可能没有值)。

存取可选型变量的值

为消除警告(当然,警告也是告诉我们程序可能存在潜在的问题),要存取可选型变量的值,需要首先判断其值是否为空,然后再用 “!” 操作符进行存取,写起来就是这样:

1
2
3
4
var myName:String? = "tom"
if obj != nil {
print("name is: \(obj!)")
}

当然,也可以进行赋值

1
2
3
4
var myName:String? = "tom"
if obj != nil {
let name = obj!
}

这样写起来比较麻烦,所以 Swift 等于了一个特殊的 if 语句,比如上面的例子,可以这样写:

1
2
3
4
var myName:String? = "tom"
if let tmp = myName {
print("name is: \(tmp)")
}

直接判断和赋值,这样在使用时就不用再使用 “!” 号。

这种表达方式也可以包括变量值为空的情况,还是上面的例子:

1
2
3
4
5
6
var myName:String?
if let tmp = myName {
print("name is: \(tmp)")
} else {
myName = "tom"
}

该 if 语句还可以同时包括多个可选型的变量和逻辑判断,表达式之间用”,”号进行分割,如:

1
2
3
4
5
var obj1:Int? = 1
var obj2:Int? = 2
if let tmp1 = obj1,let tmp2 = obj2, tmp1 < tmp2 {
print(tmp1,tmp2)
}

下一步

接下来,我们将简要的介绍 Swift 中的集合类型 - 列表(Array)

本文标题:Swift 语言简明教程(四) - 元组与可选型

文章作者:Morning Star

发布时间:2021年04月15日 - 10:04

最后更新:2022年01月14日 - 11:01

原始链接:https://www.mls-tech.info/app/swift/swift-tutorial-4-tuple-optional/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。