这是我参与更文挑战的第2天,活动详情查看: 更文挑战markdown
元组把多个值组合成一个复合值。元组内的值能够是任意类型,并不要求是相同类型。数据结构
eg: (Int,String)
、(Int,Int,Bool)
等等app
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"
复制代码
在 OC 中不存在可选项的概念,一个方法的返回值是一个对象,若是没有对象会返回 nil 。nil 只适用于对象,不适用与结构体和枚举。对于结构体和枚举,OC 一般用 NSNotFound 表示值的缺失。 而在 Swift 中,使用optionals
处理任何类型,判断它们是否有值post
optionals
optionals
)来处理值可能缺失的状况?
,问号(?)
暗示包含的值是可选类型,也就是说可能包含 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 值也可能不包含值。ui
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
比较来判断一个可选值是否包含值,使用==
或 !=
来执行比较spa
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
}
复制代码
使用可选绑定来判断可选类型是否包含值,若是包含就把值赋给一个临时常量或者变量,可选绑定能够与if
和while
语句一块儿使用,以检查可选中的值,并将该值提取到常量或变量中,做为单个操做的一部分code
if
语句为例,进行可选绑定let strNum = "123"
if let actualNum = Int(strNum) {
print("字符串 \"\(strNum)\"转为数字为 \(actualNum)")
} else {
print("字符串 \"\(strNum)\" 不能被转为数字")
}
//字符串 "123"转为数字为 123
复制代码
若是Int
初始化返回的可选Int(strNum)
值包含一个值,则赋值给一个新常量 actualNum并执行if
语句的第一个分支orm
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
复制代码
有时候在代码逻辑中,第一次被赋值以后,能够肯定一个可选类型总会有值。这种类型的可选状态被定义为隐式解析可选类型
,Swift中隐式解析可选类型主要用在类初始化。对象
把想要用做可选的类型的后面的问号?
改为感叹号!
来声明一个隐式解析可选类型。生命周期
一个隐式解析可选类型其实就是一个普通的可选类型,可是能够被当作非可选类型来使用,并不须要每次都使用解析来获取可选值。下面的例子展现了可选类型 String 和隐式解析可选类型 String 之间的区别:
let name: String? = "xiaoming."
let studentName: String = name! // 须要感叹号来获取值
let city: String! = "Shanghai."
let studentCity: String = city // 不须要感叹号
复制代码
注意:
若是一个变量以后可能变成nil
的话请不要使用隐式解析可选类型。若是你须要在变量的生命周期中判断是不是nil
的话,请使用普通可选类型。