這是我參與更文挑戰的第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
的話,請使用普通可選類型。