函數(shù)定義與調(diào)用
- 無參數(shù),無返回值(沒有定義返回類型的函數(shù)會(huì)返回Void,它其實(shí)是一個(gè)空的元組,可以寫成())
func sayHI(){
print("sayHI")
}
sayHI()
- 有參數(shù),無返回值
func sayHI(name:String) {
print("hello " + name)
}
sayHI(name: "lily")
- 無參數(shù),有返回值
func sayHI() -> String {
return "sayHI"
}
let str = sayHI()
- 有參數(shù),有返回值
func sayHI(name:String,age:Int) -> String {
return "我是\(name),今年\(age)歲"
}
let str = sayHI(name: "lily", age: 12)
函數(shù)參數(shù)標(biāo)簽和參數(shù)名稱
- 指定參數(shù)標(biāo)簽(參數(shù)名稱前面編寫參數(shù)標(biāo)簽,用空格分隔)
func sayHI(nameLabel name:String,ageLabel age:Int) -> String {
return "我是\(name),今年\(age)歲"
}
- 省略參數(shù)標(biāo)簽(不想要參數(shù)的參數(shù)標(biāo)簽,請(qǐng)為該參數(shù)編寫下劃線(_))
func sayHello(_ name:String,ageLabel age:Int) {
print("我是\(name),今年\(age)歲")
}
sayHello("lily", ageLabel: 12)
- 默認(rèn)參數(shù)值(函數(shù)體中可以為參數(shù)定義默認(rèn)值,當(dāng)默認(rèn)值被定義之后,調(diào)用函數(shù)時(shí)可以忽略這個(gè)參數(shù))
將沒有默認(rèn)值的參數(shù)放在函數(shù)參數(shù)列表的最前
func sayHello(nameLabel name:String,ageLabel age:Int = 12) {
print("我是\(name),今年\(age)歲")
}
sayHello(nameLabel: "lily")
- 可變參數(shù)
- 一個(gè)可變參數(shù)可以接受零個(gè)或多個(gè)值
- 函數(shù)調(diào)用時(shí),函數(shù)參數(shù)可以傳入多個(gè)
- 在變量類型名后面加入(...)的方式來定義可變參數(shù)
- 可變參數(shù)的傳入值在函數(shù)體中以數(shù)組形式讀取
- 一個(gè)函數(shù)最多只能擁有一個(gè)可變參數(shù)
func message(_ str:String ...) {
print(str[0] + " " + str[1])
}
message("hello","world")
- 指針類型(輸入輸出參數(shù))
- 輸入輸出參數(shù)可以改變函數(shù)體外的值
- 定義輸入輸出參數(shù)時(shí),在參數(shù)定義前加
inout關(guān)鍵字 - 輸入輸出參數(shù)不能有默認(rèn)值,而且可變參數(shù)不能用 inout 標(biāo)記
- 只能傳遞變量給輸入輸出參數(shù),當(dāng)傳入的參數(shù)作為輸入輸出參數(shù)時(shí),需要在參數(shù)名前加 & 符,表示這個(gè)值可以被函數(shù)修改
func exchangeValue(valueA value1:inout Int,valueB value2:inout Int) {
let temp = value1
value1 = value2
value2 = temp
}
var a = 3
var b = 5
exchangeValue(valueA: &a, valueB: &b)
print("\(a),\(b)") //5,3
函數(shù)類型
- 函數(shù)的類型由函數(shù)的參數(shù)類型和返回類型組成
func add(_ a:Int, _ b:Int) -> Int {
return a + b
}
這個(gè)函數(shù)的類型是(Int, Int) -> Int,可以理解為“這個(gè)函數(shù)類型有倆個(gè)Int型的參數(shù)并返回一個(gè)Int型的值”
func sayHI(){
print("sayHI")
}
這個(gè)函數(shù)的類型是() -> void,可以理解為“這個(gè)函數(shù)類型沒有參數(shù),返回Void類型的函數(shù)”
- 函數(shù)類型的使用
定義一個(gè)類型為函數(shù)的常量或變量,并將適當(dāng)?shù)暮瘮?shù)賦值給它
func add(_ a:Int, _ b:Int) -> Int {
return a + b
}
//定義一個(gè)叫做 function 的變量,類型是‘一個(gè)有兩個(gè) Int 型的參數(shù)并返回一個(gè) Int 型的值的函數(shù)’,并讓這個(gè)新變量指向 add 函數(shù)
var function :(Int,Int)-> Int = add
print(function(2,3))
- 函數(shù)類型作為參數(shù)
定義了showResult(_:_:_:)函數(shù),它有三個(gè)參數(shù):第一個(gè)參數(shù)叫fun,類型是(Int, Int) -> Int,你可以傳入任何這種類型的函數(shù);第二個(gè)和第三個(gè)參數(shù)叫a和b,它們的類型都是Int,這兩個(gè)值作為已給出的函數(shù)的輸入值
func showResult(_ fun:(Int,Int)->Int,_ a:Int,_ b:Int) {
print(fun(a,b))
}
func add(_ a:Int, _ b:Int) -> Int {
return a + b
}
showResult(add(_:_:), 3, 2)
showResult(_:_:_:) 函數(shù)的作用就是輸出另一個(gè)適當(dāng)類型的數(shù)學(xué)函數(shù)的調(diào)用結(jié)果。它不關(guān)心傳入函數(shù)是如何實(shí)現(xiàn)的,只關(guān)心傳入的函數(shù)是不是一個(gè)正確的類型。這使得 showResult(_:_:_:) 能以一種類型安全(type-safe)的方式將一部分功能轉(zhuǎn)給調(diào)用者實(shí)現(xiàn)。
- 函數(shù)類型作為返回值
定義了兩個(gè)簡(jiǎn)單函數(shù),分別是sayHI(_:)和sayHello(_:),這兩個(gè)函數(shù)的類型都是(String) -> String。之后在定義一個(gè)showResult(:)的函數(shù),它的返回類型是(String) -> String類型的函數(shù)。showResult(backward:)根據(jù)布爾值來返回(String) -> String類型函數(shù)
func sayHI(_ name:String) -> String {
return "HI \(name)"
}
func sayHello(_ name:String) -> String {
return "Hello \(name)"
}
func showResult(_ backward: Bool) -> (String) -> String {
return backward ? sayHI : sayHello
}
let show = showResult(true)
print(show("world")) //HI world
嵌套函數(shù)
把函數(shù)定義在別的函數(shù)體中,稱作嵌套函數(shù)
func showResult(_ backward: Bool) -> (String) -> String {
func sayHI(_ name:String) -> String {
return "HI \(name)"
}
func sayHello(_ name:String) -> String {
return "Hello \(name)"
}
return backward ? sayHI : sayHello
}
let show = showResult(true)
print(show("world")) //HI world