一、元組
1.1、元組(tuples)把多個值組合成一個復(fù)合值。元組內(nèi)的值可以使任意類型,并不要求是相同類型。
下面這個例子中,(404, "Not Found")是一個??述 HTTP 狀態(tài)碼(HTTP status code)的元組。HTTP 狀態(tài)碼是當(dāng)你請求網(wǎng)頁的時候 web 服務(wù)器返回的一個特殊值。如果你請求的網(wǎng)頁不存在就會返回一個 404 Not Found 狀態(tài)碼。
let http404Error = (404,"Not Found")
(404, "Not Found")元組把一個 Int 值和一個 String 值組合起來表示 HTTP 狀態(tài)碼的兩個部分:一個數(shù)字和一個人類可讀的??述。這個元組可以被??述為“一個類型為(Int, String)的元組”。
你可以把任意順序的類型組合成一個元組,這個元組可以包含所有類型。只要你想,你可以創(chuàng)建一個類型為(Int, Int, Int)或者(String, Bool)或者其他任何你想要的組合的元組。
1.2、
你可以將一個元組的內(nèi)容分解(decompose)成單獨的常量和變量,然后你就可以正常使用它們了:
let(statusCode,statusMessage) = http404Error
print(statusCode)
// 輸出的結(jié)果為 404
print(statusMessage)
// 輸出的結(jié)果為 Not Found
如果你只需要一部分元組值,分解的時候可以把要忽略的部分用下劃線(—)標(biāo)記:
let (justStatusCode,_) = http404Error
print(justStatusCode)
// 輸出的結(jié)果為 404
此外你還可以通過下標(biāo)來訪問元組中的單個元素,下標(biāo)從0開始
print("the statua code is \(http404Error.0)")
你可以在定義元組的時候給單個元素命名,就可以直接通過名字來獲取這些元素
let http200Status = (statusNum:200,description:"OK")
print(http200Status.statusNum)
// 打印 200
print(http200Status.description)
// 打印 ok
注意:元組在臨時組織值的時候很有用,但是并不適合創(chuàng)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。如果你的數(shù)據(jù)結(jié)構(gòu)并不是臨時使用,請使用類或者結(jié)構(gòu)體而不是元組。請參考類和結(jié)構(gòu)體。
二、可選
下面的例子:
let possibleNumber:String? = "234"
//let convertedNumber = Int(possibleNumber)
if let result = possibleNumber {
print("success")
}
else {
print("failed")
}
// 輸出的success
如果可選值為nil則輸出failed
注意:Swift 的 nil 和 Objective-C 中的 nil 并不一樣。在 Objective-C 中,nil 是一個指向不存在對象的指針。在 Swift 中,nil 不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選都可以被設(shè)置為 nil,不只是對象類型。
隱式解析可選
有時候在程序架構(gòu)中,第一次被賦值之后,可以確定一個可選總會有值。在這種情況下,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值。這種類型的可選被定義為隱式解析可選(implicitly unwrapped optionals)。把想要用作可選的類型的后面的問號(String?)改成感嘆號(String!)來聲明一個隱式解析可選。
看下二者的區(qū)別:
1. let possibleString: String? = "An optional string."
2. println(possibleString!) // 需要驚嘆號來獲取值
3. // 輸出 "An optional string."
4.
5. let assumedString: String! = "An implicitly unwrapped optional string."
6. println(assumedString) // 不需要感嘆號
7. // 輸出 "An implicitly unwrapped optional string."
三、斷言
可選可以讓你判斷值是否存在,你可以在代碼中優(yōu)雅地處理值缺失的情況。然而,在??些情況下,如果值缺失或者值并不滿足特定的條件,你的代碼可能并不需要繼續(xù)執(zhí)行。這時,你可以在你的代碼中觸發(fā)一個斷言(assertion)來結(jié)束代碼運行并通過調(diào)試來找到值缺失的原因。
斷言會在運行時判斷一個邏輯條件是否為 true。從字面意思來說,斷言“斷言”一個條件是否為真。你可以使用斷言來保證在運行其他代碼之前,??些重要的條件已經(jīng)被滿足。如果條件判斷為 true,代碼運行會繼續(xù)進行;如果條件判斷為 false,代碼運行停止,你的應(yīng)用被終止。
如果你的代碼在調(diào)試環(huán)境下觸發(fā)了一個斷言,比如你在 Xcode 中構(gòu)建并運行一個應(yīng)用,你可以清楚地看到不合法的狀態(tài)發(fā)生在哪里并檢查斷言被觸發(fā)時你的應(yīng)用的狀態(tài)。此外,斷言允許你附加一條調(diào)試信息。
你可以使用全局 assert 函數(shù)來寫一個斷言。向 assert 函數(shù)傳入一個結(jié)果為 true 或者 false的表達式以及一條信息,當(dāng)表達式為 false 的時候這條信息會被顯示:
1. let age = -3
2. assert(age >= 0, "A person's age cannot be less than zero")
3. // 因為 age < 0,所以斷言會觸發(fā)
在這個例子中,只有 age >= 0 為 true 的時候代碼運行才會繼續(xù),也就是說,當(dāng) age 的值非負的時候。如果 age 的值是負數(shù),就像代碼中那樣,age >= 0 為 false,斷言被觸發(fā),結(jié)束應(yīng)用。
斷言信息不能使用字符串插值。斷言信息可以省略,就像這樣:
- assert(age >= 0)何時使用斷言
當(dāng)條件可能為假時使用斷言,但是最終一定要保證條件為真,這樣你的代碼才能繼續(xù)運行。
斷言的適用情景:
整數(shù)的附屬腳本索引被傳入一個自定義附屬腳本實現(xiàn),但是下標(biāo)索引值可能太小或者太大。
需要給函數(shù)傳入一個值,但是非法的值可能導(dǎo)致函數(shù)不能正常執(zhí)行。- 一個可選值現(xiàn)在是 nil,但是后面的代碼運行需要一個非 nil 值。
請參考附屬腳本和函數(shù)。
注意:斷言可能導(dǎo)致你的應(yīng)用終止運行,所以你應(yīng)當(dāng)仔細設(shè)計你的代碼來讓非法條件不會出現(xiàn)。然而,在你的應(yīng)用發(fā)布之前,有時候非法條件可能出現(xiàn),這時使用斷言可以快速發(fā)現(xiàn)問題。
四、區(qū)間運算符
4.1、閉區(qū)間運算符,a...b 包含a和b的所有值的區(qū)間
例子:
var sum = 0
for index in 1...5
{
sum += index
print(index)
}
4.2、半閉區(qū)間
半閉區(qū)間 a..b 定義一個從 a 到 b 但不包括 b 的區(qū)間. 之所以稱為半閉區(qū)間, 是因為該區(qū)間包含第一個值而不包括最后的值.半閉區(qū)間的實用性在于當(dāng)你使用一個0始的列表(如數(shù)組)時, 非常方便地從0數(shù)到列表的長度.
例子:
1. let names = ["Anna", "Alex", "Brian", "Jack"]
2. let count = names.count
3. for i in 0..count {
4. println("第 \(i + 1) 個人叫 \(names[i])")
5.
}
6. // 第 1 個人叫 Anna
7. // 第 2 個人叫 Alex
8. // 第 3 個人叫 Brian
9. // 第 4 個人叫 Jack