函數和閉包

使用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)
相關文章
相關標籤/搜索