標籤:style 使用 strong cti for 代碼
Mutability of Collections (可變集合)
字典和數組都是在一個集合裡儲存多個值.如果你建立數組或字典後賦值給一個變數,那麼這個集合就是可變的( mutable).這就意味著你在建立這個集合之後,依然可以改變這個集合的 大小,添加元素到集合裡或者刪除已有的元素.相反地,如果你建立的數組或者字典賦值給一個常量,那麼這個集合就是不能修改的,也就是說字典或者數組是不可變的(immutable)
對於字典,不可變就意味著你不能替換裡面已有的索引值對,一個不可變的字典在它一建立出來就是不可以改變的.
對於數組,不可變與字典有一些輕微的不同,雖然依然是不允許修改數組的大小的任何操作,但是允許你對已經有的值重新設定新值.這使得在Swift中,數群組類型大小固定後仍然有較高的 執行效率.
數組的可變性對於怎樣修改或者賦值一個數組執行個體也是依然有效.
第四章
Control Flow (流程式控制制)
Swift提供了與C語言相似的流程式控制制結構.這些包括for和while迴圈;if和switch語句執行不同分支代碼;以及像break和continue語句來在代碼中實現跳轉.
除了傳統的for迴圈之外,Swift增加了for-in迴圈,這使得遍曆數組,字典,範圍和其他序列更加容易.
Swift的switch語句也比C語言中的更加強大和精確.在Swift中,switch的每個case語句不會再掉落到下一個case中,這樣避免了像C語言中缺少了break會造成的錯誤.case可以匹配許 多不同模式類型,包括範圍匹配,元組,或者某種指定類型.在switch的case中匹配的值可以綁定給一個在case體中的臨時常量或變數,並且每個case中複雜的匹配條件可以使用where 分支語句.
For Loops (For迴圈)
一個for迴圈是反覆某些次數的執行一組語句.Swift中提供了兩種for迴圈:
-
- for-in 在一個範圍,序列,集合中執行語句處理每個元素.
- for-condition-increment 執行一組語句知道指定的條件符合.典型的是使用在每次迴圈後使用增量.
For-In
你可以使用for-in迴圈來遍曆整個集合的元素,例如數組的元素,字串裡的字元以及範圍的值.
下面的代碼例子輸出了五個列表:
for index in 1...5 {
println("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
遍曆集合的元素是使用了閉合範圍1到5的區間.因此使用閉合範圍的操作符(...).index的值在第一次的時候被設定位範圍中的1,然後執行迴圈內部的語句.在這個例子中,迴圈中只有 一個語句,它輸出每次迴圈中index的當前值.在語句執行後,index被更新為範圍中的2,然後println函數被再次調用,這個過程直到條件達到範圍最後的值.
在上面的代碼例子中,index是一個常量,它在每次迴圈遍曆的時候都被自動化佈建範圍中的值.因此它在使用之前沒有進行聲明定義.它在迴圈中被隱式的簡單定義了,因此不需要使用let 關鍵字.
注意點:
常量index的存在範圍僅僅限於迴圈內.如果你像在迴圈完成之後檢查index的值,或者你需要讓它成為變數而不是常量,你必須親自在迴圈之前明確定義.
如果你不需要範圍中的每個值,你可以使用底線(_)來代替變數:
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
answer *= base
}
println("\(base) to the power of \(power) is \(answer)")
// prints "3 to the power of 10 is 59049”
這個代碼例子計算一個數值的幾次方的值(這個例子中,是3的10次方).
在數組中使用for-in迴圈來遍曆元素:
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
println("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!
你也可以遍曆字典訪問它的索引值對,在遍曆的時候,字典中的每個索引值對都被當作一個(key, value)元組來返回,你可以在迴圈中使用已經命名的常量來解析(key, value)元組中的成員.下 面的例子中,字典的key被解析到常量animalName中,字典的值被解析到常量legCount中:
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
println("\(animalName)s have \(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs
在一個字典中的元素,不需要按照他們被寫入時的順序進行遍曆.字典中的內容是無順序的,並且遍曆的所有元素的順序不能保證是按照順序擷取的.
除了字典和數組,你也可是用for-in來變數字串裡的每個字元:
for character in "Hello" {
println(character)
}
// H
// e
// l
// l
// o