函數(shù)
使用func聲明一個函數(shù)咬荷。 通過使用它的名稱和括號中的參數(shù)列表來調(diào)用函數(shù)愕提。 使用 - >將參數(shù)名稱和類型與函數(shù)的返回類型分開。
//聲明一個函數(shù)
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
//調(diào)用函數(shù)
greet(person: "Bob", day: "Tuesday")
默認情況下荆责,函數(shù)使用它們的參數(shù)名稱作為其參數(shù)的標簽饰躲。 在參數(shù)名稱前寫入自定義參數(shù)標簽牙咏,或者寫入"" _ ""表示不使用參數(shù)標簽。
func greet(_ person: String, on day: String) -> String {//_
return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")
給函數(shù)的參數(shù)添加自定義的標簽
func greet(customName person: String, on day: String) -> String {
return "Hello \(person), today is \(day)."
}
greet(customName:"John", on: "Wednesday")
使用元組制作復(fù)合值 - 例如属铁,從函數(shù)返回多個值眠寿。 元組的元素可以通過名稱或通過下標來引用。
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ù)也可以采用可變數(shù)量的參數(shù)焦蘑,將它們收集到數(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ù)可以訪問在外部函數(shù)中聲明的變量例嘱。
func returnFifteen() -> Int {
var y = 10
func add() { //聲明一個嵌套函數(shù)
y += 5使用外部函數(shù)中聲明的變量
}
add()//調(diào)用嵌套函數(shù)
return y
}
returnFifteen()
函數(shù)是first-class類型狡逢。 這意味著一個函數(shù)可以返回另一個函數(shù)作為它的返回值。
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne // 返回一個函數(shù)
}
var increment = makeIncrementer()//返回的函數(shù)用變量來接收
increment(7) //調(diào)用返回的函數(shù)
函數(shù)可以將另一個函數(shù)作為其參數(shù)之一拼卵。
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for item in list {
if condition(item) {//如果condition函數(shù)返回為true奢浑,則外函數(shù)為true
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)//將判斷的函數(shù)傳入,如果有滿足條件的腋腮,返回為true
閉包
函數(shù)實際上是閉包的特殊情況:稍后可以調(diào)用的代碼塊雀彼。 閉包中的代碼可以訪問在創(chuàng)建閉包的時可用的變量和函數(shù)。 你可以使用大括號({})寫一個沒有名稱的閉包即寡。 使用in將參數(shù)和返回類型從主體中分離徊哑。
var numbers = [20, 19, 7, 12]
let num = numbers.map({
(number: Int) -> Int in //拿到變量和函數(shù)
let result = 3 * number //對變量和函數(shù)進行操作
return result //返回結(jié)果
})
如果是一個字典調(diào)用了map,會是下面這種情況
var numbers = ["key1":20, "key2":19, "key3":7, "key4":12]
let num = numbers.map({
numberA -> Int in //這時的numberA是一個元組
return numberA.value //拿到的是字典中的值聪富,如果想要拿到字典中的鍵::numberA.key
})
在以下情況發(fā)生的時候莺丑,你可以簡化閉包的寫法
- 當一個閉包的類型已經(jīng)知道,例如一個代理的回調(diào)墩蔓,你可以忽略它的參數(shù)的類型梢莽,它的返回類型,或參數(shù)類型和返回值類型奸披。 只有一條語句的閉包會返回這條語句的值昏名。
var numbers = [20, 19, 7, 12]
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
你可以按數(shù)字來引用參數(shù) - 這個方法在非常短的閉包中尤其有用。 作為函數(shù)的最后一個參數(shù)傳遞的閉包可以緊跟在括號后面阵面。 當閉包是函數(shù)的唯一參數(shù)時葡粒,可以完全省略括號份殿。
var numbers = [20, 19, 7, 12]
let sortedNumbers = numbers.sorted { $0 < $1 }
print(sortedNumbers)