標籤:swift
用 func 來定義一個函數。func後面寫上函數名,緊跟著是參數列表,寫在括弧裡。在傳回型別與參數名之間用 -> 來分隔開。
func greet(name: String, day: String) -> String { return "Hello \(name), today is \(day)."}greet("Bob", "Tuesday")
試一試
去掉 day 參數。在問候語裡加上一個今天特價菜的參數
使用元組來建立一個組合值——例如,要從函數裡返回多個值。元組裡的這些元素既可以用名稱進行引用,也可以用數字來引用。
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([5, 3, 100, 3, 9])println(statistics.sum)println(statistics.2)
函數還可以接受一批參數,將它們收集到一個數組裡。
func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum}sumOf()sumOf(42, 597, 12)
試一試
寫一個Function Compute參數的平均值。
函數是可以嵌套的。嵌套的函數可以訪問到定義在函數外的變數。你可以用嵌套函數來把又長又臭的程式碼群組織一下。
func returnFifteen() -> Int { var y = 10 func add() { y += 5 } add() return y}returnFifteen()
函數是頭等(first-class,博主註:不知道該怎麼翻譯了)類型。意思是函數可以返回另一個函數作為它的值。
func makeIncrementer() -> (Int -> Int) { func addOne(number: Int) -> Int { return 1 + number } return addOne}var increment = makeIncrementer()increment(7)
函數可以將另一個函數作為參數。
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(numbers, lessThanTen)
函數其實是閉包(可以過後調用的程式碼片段)的一個特例。閉包內的代碼可以訪問到變數和函數必須是與閉包建立的範圍是一致的,即便閉包是在另一個範圍內執行——在講嵌套函數時就說過這個例子了。閉包可以不用寫名稱,只需把代碼寫在花括弧內 ({})。在代碼體裡用 in 來分隔開參數和傳回型別。
numbers.map({ (number: Int) -> Int in let result = 3 * number return result})
試一試
重寫這個閉包,對所有奇數都返回0
有幾種方法可以更簡明地寫閉包。當閉包的類型是已知的,比如委託的回調,可以忽略掉參數的類型,傳回型別,或者兩個都忽略。單行語句的閉包隱式返回語句中的值。
let mappedNumbers = numbers.map({ number in 3 * number })println(mappedNumbers)
你可以用數字而不是名稱來引用參數——這種方法在非常短的閉包中尤其實用。作為最後一個參數傳到函數裡的閉包可以在括弧後面馬上出現。
let sortedNumbers = sorted(numbers) { $0 > $1 }println(sortedNumbers)
Swift之旅(三)函數與閉包