元组(Tuples)
元组将多个值分组为一个复合值,元祖中的值可以是任何类型,而不比彼此相通。
定义一个元组
例:
let httpStatus = (statusCode: 200, description: "ok")
读取数据:
if httpStatus.statusCode == 200 {
// ...
}
元组作为函数的返回值
使用元组作为返回值,可以返回多个返回值,而且返回的多个值的类型不受限制。
元组作为函数的返回值,在接收端需要知道元组的每个元素的类型,从而不至于取值出错。
元组的适用范围
注意:元组适用于简单的一组数据,如果数据结构比较多,太过复杂的话,不建议使用元组,这时候使用类或者结构体来定义复杂的数据结构。
可选类型(Optionals)
在Objective-C中接触过Option,Swift中的Optionals好像和OC中的不太一样。
在Swift中的Optional,适用于缺省值的情况下。
Optional和Option还不是一个东西,Swift中的可选这个概念在C和OC中是没有的。在OC中与Swift的Optional比较相近的概念是将nil作为返回值。返回nil,表示没有有效的对象,nil只适用于对象,不适用于基本的数据结构或者枚举,基本数据返回nil时,往往会返回的是0。对于这些类型,在OC中一般是返回一个特定的值,例如枚举的话我们默认返回0,定义为xxxdefault、xxxNone等。
定义可选类型
let number : int ?
在数据类型后面添加一个问号,表示这是一个可选值类型。可能是int,也可能不是。
示例分析
let result: Int? = 30
print(result)
上面的代码,编译后会报如下警告:
Expression implicitly coerced from ‘Int?’ to ‘Any’
Provide a default value to avoid this warning
Force-unwrap the value to avoid this warning
Explicitly cast to ‘Any’ with ‘as Any’ to silence this warning
原因是编译器不知道result这个值到底是什么,因为它是一个可选类型。
系统给提供了三个处理警告的办法,点击fix即可
- 添加一个默认值
let result: Int? = 10
print(result ?? 0)
如果有值则是该值,如果没值,result是0。
- unwrap解包装
let result: Int? = 10
print(result!)
这种情况需要注意,当result被赋值为nil的时候,会闪退。
这里有一个问题就是 感叹号 在这里的作用。
let result: Int? = 10
print(result as Any)
这种做法个人感觉是比较好的,当result有值时就是被赋予的值,如果没值时候就是nil,也不会闪退。
Optional中使用nil
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
注意:
Swift中的nil与OC中的nil不一样。OC中nil是指向不存在的对象的指针。在Swift中nil不是指针,是缺少某种类型的值,可以将任何类型的Optionals这是为nil,而不仅仅是对象类型。