元组(tuples)
元组把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
eg: (Int,String)
、(Int,Int,Bool)
等等
- 元组的定义
- 定义元组时,可以在元组中命名各个元素
let http404Error = (statusCode: 404, description: "Not Found") 复制代码
- 也可以直接定义
let http404Error = (404,"Not Found") 复制代码
- 元组的访问
- 可以将元组的内容分解为单独的常量或变量
let http404Error = (404,"Not Found") let (statusCode,statusMessage) = http404Error; print(statusCode) //404 print(statusMessage) //Not Found 复制代码
- 如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线
(_)
标记
let http404Error = (404,"Not Found") let (statusCode, _) = http404Error print("The status code is \(statusCode)") //The status code is 404 复制代码
- 通过下标来访问元组中的单个元素,下标从零开始
let http404Error = (404,"Not Found") print("The status code is \(http404Error.0)") //The status code is 404 print("The status message is \(http404Error.1)") //The status code is 404 复制代码
- 如果在元组中命名元素,则可以使用元素名称来访问这些元素的值
let http200Status = (statusCode: 200, description: "OK") print("The status code is \(http200Status.statusCode)") // Prints "The status code is 200" print("The status message is \(http200Status.description)") // Prints "The status message is OK" 复制代码
注意:
元组在临时组合值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组
可选类型(optionals)
在 OC 中不存在可选项的概念,一个方法的返回值是一个对象,如果没有对象会返回 nil 。nil 只适用于对象,不适用与结构体和枚举。对于结构体和枚举,OC 通常用 NSNotFound 表示值的缺失。
而在 Swift 中,使用optionals
处理任何类型,判断它们是否有值
optionals
- 使用可选类型(
optionals
)来处理值可能缺失的情况 - 可选的代表两种可能性
- 有值
- 没值
- 一个可选的 XXX 被写作 XXX
?
,问号(?)
暗示包含的值是可选类型,也就是说可能包含 XXX 值也可能不包含值
let strNum = "123"
let a = Int(strNum)
print(a) //Optional(123) //a 被推断为Int类型,或 optional Int 类型
let str = "b"
let b = Int(str)
print(b) //nil
复制代码
因为 Int 初始化可能会失败,所以它返回一个可选类型optional Int
,而不是一个Int
。也就是说可能包含 Int 值也可能不包含值。
nil
- 给可选变量赋值为
nil
来表示它没有值
var value: Int? = 10 //value 包含一个可选的 Int 值 10
value = nil // value 现在不包含值
复制代码
- 声明一个可选常量或者变量但是没有赋值,它们会自动被设置为
nil
var message: String? //message 被自动设置为 nil
复制代码
nil
不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型
var a:String = nil //报错
let b: Int = nil //报错
var a:String? = nil //正确 nil
let b: Int? = nil //正确 nil
复制代码
if语句
以及强制解析
可以使用 if语句
和 nil
比较来判断一个可选值是否包含值,使用==
或 !=
来执行比较
- 如果可选类型有值,它将不等于
nil
var code: Int? = 10
if code != nil {
print("code是个整数") //code是个整数
}
复制代码
- 当你确定可选类型确实包含一个非
nil
的值之后,你可以在可选的名字后面加一个感叹号!
来获取值。这个感叹号!
表示“这个可选有值,可以使用”。这被称为可选值的强制解析(forced unwrapping)
var code: Int? = 10
if code != nil {
print("code 值为 \(code!)")code 值为 10
}
复制代码
可选绑定(optional binding)
使用可选绑定来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量,可选绑定可以与if
和while
语句一起使用,以检查可选中的值,并将该值提取到常量或变量中,作为单个操作的一部分
- 以
if
语句为例,进行可选绑定
let strNum = "123"
if let actualNum = Int(strNum) {
print("字符串 \"\(strNum)\"转为数字为 \(actualNum)")
} else {
print("字符串 \"\(strNum)\" 不能被转为数字")
}
//字符串 "123"转为数字为 123
复制代码
如果Int
初始化返回的可选Int(strNum)
值包含一个值,则赋值给一个新常量 actualNum并执行if
语句的第一个分支
- 单个
if
语句中可以包含任意数量的可选绑定和布尔条件,它们之间需要用逗号,
隔开,如果可选绑定中有nil
或布尔条件计算结果为false
,则整个if
语句的条件被视为false
if let firstNumber = Int("2"), let secondNumber = Int("8"), firstNumber < secondNumber && secondNumber < 10 {
print("\(firstNumber) < \(secondNumber) < 10")
}else{
print("其他处理")
}
// 2 < 8 < 10
复制代码
隐式解析可选类型(implicitly unwrapped optionals)
有时候在代码逻辑中,第一次被赋值之后,可以确定一个可选类型总会有值。这种类型的可选状态被定义为隐式解析可选类型
,Swift中隐式解析可选类型主要用在类初始化。
把想要用作可选的类型的后面的问号?
改成感叹号!
来声明一个隐式解析可选类型。
一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。下面的例子展示了可选类型 String 和隐式解析可选类型 String 之间的区别:
let name: String? = "xiaoming."
let studentName: String = name! // 需要感叹号来获取值
let city: String! = "Shanghai."
let studentCity: String = city // 不需要感叹号
复制代码
注意:
如果一个变量之后可能变成nil
的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil
的话,请使用普通可选类型。