使用func
來聲明一個函數,使用名字和參數來調用函數。使用->
來指定函數返回值的類型。javascript
func greet(name: String, day: String) -> String { return "Hello \(name), today is \(day)." } greet("Bob", day: "Tuesday")
練習: 刪除
day
參數,添加一個參數來表示今天吃了什麼午餐。java
使用元組來讓一個函數返回多個值。該元組的元素能夠用名稱或數字來表示。swift
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]) print(statistics.sum) print(statistics.2)
函數能夠帶有可變個數的參數,這些參數在函數內表現爲數組的形式:數組
func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum } sumOf() sumOf(42, 597, 12)
練習: 寫一個計算參數平均值的函數。閉包
函數能夠嵌套。被嵌套的函數能夠訪問外側函數的變量,你可使用嵌套函數來重構一個太長或者太複雜的函數。app
func returnFifteen() -> Int { var y = 10 func add() { y += 5 } add() return y } returnFifteen()
函數是第一等類型,這意味着函數能夠做爲另外一個函數的返回值。less
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, condition: lessThanTen)
函數其實是一種特殊的閉包:它是一段能以後被調取的代碼。閉包中的代碼能訪問閉包所建做用域中能獲得的變量和函數,即便閉包是在一個不一樣的做用域被執行的 - 你已經在嵌套函數例子中所看到。你可使用{}
來建立一個匿名閉包。使用in
將參數和返回值類型聲明與閉包函數體進行分離。ui
numbers.map({
(number: Int) -> Int in let result = 3 * number return result })
練習: 重寫閉包,對全部奇數返回0。spa
有不少種建立更簡潔的閉包的方法。若是一個閉包的類型已知,好比做爲一個回調函數,你能夠忽略參數的類型和返回值。單個語句閉包會把它語句的值當作結果返回。
let mappedNumbers = numbers.map({ number in 3 * number }) print(mappedNumbers)
你能夠經過參數位置而不是參數名字來引用參數——這個方法在很是短的閉包中很是有用。當一個閉包做爲最後一個參數傳給一個函數的時候,它能夠直接跟在括號後面。當一個閉包是傳給函數的惟一參數,你能夠徹底忽略括號。
let sortedNumbers = numbers.sort { $0 > $1 } print(sortedNumbers)