使用"func"來(lái)聲明一個(gè)函數(shù)妓湘,使用名字和參數(shù)來(lái)調(diào)用函數(shù)换薄。使用->來(lái)指定函數(shù)返回值的類型换可。
func greet(person: String, day: String) -> String {
? return "Hello \(person), today is \(day)."
}
greet(person:"Bob", day: "Tuesday")
默認(rèn)情況下色建,函數(shù)使用它們的參數(shù)名稱作為它們參數(shù)的標(biāo)簽,在參數(shù)名稱前可以自定義參數(shù)標(biāo)簽宦棺,或者使用“_”表示不使用參數(shù)標(biāo)簽瓣距。
func greet(_ person: String, on day: String) -> String {
? return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")
使用元組來(lái)讓一個(gè)函數(shù)返回多個(gè)值。該元組的元素可以用名稱或數(shù)字來(lái)表示代咸。
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)
print(statistics.2)
函數(shù)可以帶有可變個(gè)數(shù)的參數(shù)蹈丸,這些參數(shù)在函數(shù)內(nèi)表現(xiàn)為數(shù)組的形式:
func sumOf(numbers: Int...) -> Int {
? var sum = 0
? for number in numbers {
? ? sum += number
? }
? return sum
}
sumOf()
sumOf(numbers: 42, 597, 12)
函數(shù)可以嵌套。被嵌套的函數(shù)可以訪問(wèn)外側(cè)函數(shù)的變量呐芥,你可以使用嵌套函數(shù)來(lái)重構(gòu)一個(gè)太長(zhǎng)或者太復(fù)雜的函數(shù)逻杖。
func returnFifteen() -> Int {
? var y = 10
? func add() {
? ? y += 5
? }
? add()
? return y
}
returnFifteen()
函數(shù)是第一等類型,這意味著函數(shù)可以作為另一個(gè)函數(shù)的返回值思瘟。
func makeIncrementer() -> ((Int) -> Int) {
? func addOne(number: Int) -> Int {
? ? return 1 + number
? }
? return addOne
}
var increment = makeIncrementer()
increment(7)
函數(shù)也可以當(dāng)做參數(shù)傳入另一個(gè)函數(shù)荸百。
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)
函數(shù)實(shí)際上是一種特殊的閉包:它是一段能之后被調(diào)取的代碼。閉包中的代碼能訪問(wèn)閉包所建作用域中能得到的變量和函數(shù)滨攻,即閉包是在一個(gè)不同的作用域被執(zhí)行的够话,你已經(jīng)在嵌套函數(shù)例子中所看到蓝翰。你可以使用“{}”來(lái)創(chuàng)建一個(gè)匿名閉包。使用“in”將參數(shù)和返回值類型聲明與閉包函數(shù)體進(jìn)行分離女嘲。
numbers.map({
? (number: Int) -> Int in
? let result = 3 * number
? return result
})
有很多種創(chuàng)建更簡(jiǎn)潔的閉包的方法畜份。如果一個(gè)閉包的類型已知,比如作為一個(gè)回調(diào)函數(shù)欣尼,你可以忽略參數(shù)的類型和返回值爆雹。單個(gè)語(yǔ)句閉包會(huì)把它語(yǔ)句的值當(dāng)做結(jié)果返回。
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
你可以通過(guò)參數(shù)位置而不是參數(shù)名字來(lái)引用參數(shù)——這個(gè)方法在非常短的閉包中非常有用媒至。當(dāng)一個(gè)閉包作為最后一個(gè)參數(shù)傳給一個(gè)函數(shù)的時(shí)候顶别,它可以直接跟在括號(hào)后面谷徙。當(dāng)一個(gè)閉包是傳給函數(shù)的唯一參數(shù)拒啰,你可以完全忽略括號(hào)。
let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)