標籤:
函數
Swift使用func關鍵字聲明函數:
func greet(name: String, day: String) -> String { return "Hello \(name), today is \(day)."}greet("Bob", "Tuesday")
通過元組(Tuple)返回多個值:
func getGasPrices() -> (Double, Double, Double) { return (3.59, 3.69, 3.79)}getGasPrices()
支援帶有變長參數的函數,用一個數組來擷取它們:
func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum}sumOf()sumOf(42, 597, 12)
函數也可以嵌套函數:
func returnFifteen() -> Int { var y = 10 func add() { y += 5 } add() return y}returnFifteen()
作為頭等對象,函數既可以作為傳回值,也可以作為參數傳遞:
// 做傳回值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)
閉包
本質來說,函數是特殊的閉包,Swift中可以利用{}聲明匿名閉包:
numbers.map({ (number: Int) -> Int in let result = 3 * number return result })
如果一個閉包的類型已知,比如作為一個回呼函數,你可以忽略參數的類型和傳回值。單個語句閉包會把它語句的值當做結果返回。
numbers.map({ number in 3 * number })
你可以通過參數位置而不是參數名字來引用參數——這個方法在非常短的閉包中非常有用。 當一個閉包作為最後一個參數傳給一個函數的時候,它可以直接跟在括弧後面。
sort([1,5,3,12,2]){$0>$1}
閉包其實是 Swift 的一種類型,寫作()->(),那麼他就可以當做 func 的參數嵌套了。寫成這樣:
140 func exec(repeat: Int, block:()->()) 141 { 142 for i in 1...repeat{ 143 block() 144 } 145 } 146 147 exec(10, {println("Hello World")})
Swift 還提出了一個特殊的詞彙:Trailing Closures,他的意思是:如果閉包是func的最後一個傳參,那麼他可以寫在外面。如下:
148 func exec(repeat: Int, block:()->()) 149 { 150 for i in 1...repeat{ 151 block() 152 } 153 } 154 155 exec(10){ 156 println("Hello World") 157 }
Swift學習2---函數和閉包