Functions and Closures
可透過 tuple 的方式產生複合數值, 可用於 function 需要回傳多個數值時. Tuple 的每一個元素可以透過變數名稱或順序存取.
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score > max { max = score } else if score < min { min = score } sum += score } return (min, max, sum) } let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9]) print(statistics.sum) // Prints "120" print(statistics.2) // Prints "120"
- 可為 nested function. 當 function 過於複雜冗長, 可使用 nested function 編排程式碼.
func returnFifteen() -> Int { var y = 10 func add() { y += 5 } add() return y } returnFifteen()
- Functions 也是類別的一種. 因此可以作為 Function 的 return value.
func makeIncrementer() -> ((Int) -> Int) { func addOne(number: Int) -> Int { return 1 + number } return addOne } var increment = makeIncrementer() increment(7)
- Function 可以作為其他 Function 的參數
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { for item in list { if condition(item) { return true } } return false } func lessThanTen(number: Int) -> Bool { return number < 10 } var numbers = [20, 19, 7, 12] hasAnyMatches(list: numbers, condition: lessThanTen)
Objects and Classes
Initializer & Deinitializer
使用 init 創建 initializer.
呼叫 superclass's initalizer : super.init(...)
使用 deinit 創建 deinitializer, 用於 class object 被釋放前的資源清除.
Properties
class properties 可以有 getter 和 setter.
使用 willSet 和 didSet 處理 property 設置前和設置後的處置
Enumerations
存取 enumeration case 可使用 rawValue property
enum Rank: Int {
case ace = 1
case two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king
func simpleDescription() -> String {
switch self {
case .ace:
return "ace"
case .jack:
return "jack"
case .queen:
return "queen"
case .king:
return "king"
default:
return String(self.rawValue)
}
}
}
let ace = Rank.ace
// Prints "ace"
let aceRawValue = ace.rawValue
// Prints "1"
也可使用 raw Value 作為 init?(rawValue:) 的參數初始化 enumeration. 當初始值無法 match enumeration 則為 nil.
if let convertedRank = Rank(rawValue: 13) {
let threeDescription = convertedRank.description()
print (threeDescription)
// Prints "king"
}
關於列舉的原始值(raw value)跟相關值(associated value)在Swift 起步走-列舉有清楚的說明.
節錄文件關於原始值和相關值的說明:原始值(raw value)跟相關值(associated value)是不同的。原始值在定義列舉時即被設置,對於一個特定的列舉成員,它的原始值始終是相同的。而相關值是在列舉成員被指派為一個變數(或常數)時才一併設置的值,列舉成員的相關值是可以不同的。