函數(shù)
函數(shù)結(jié)構(gòu)
func關(guān)鍵詞 + 函數(shù)名 + 形式參數(shù) + "->"(表示返回) + 返回類型
func sum(number1:Int, numbe2:Int) -> Int {
number + number // 單一表達式,可省略關(guān)鍵詞return
}
備注:
當(dāng)函數(shù)體位單一表達式是,可以省略關(guān)鍵詞return,表示直接返回該單一表達式的值
無返回值
無返回值總共有三種寫法。
/**
* 方式1:直接不寫返回類型
*/
func voidFunc1() {
print(111)
}
/**
* 方式2:返回Void
*/
func voidFunc2() -> Void {
print(222)
}
/**
* 方式3:返回空元組()
*/
func voidFunc3() -> () {
print(333)
}
備注:
實際上Swift定義中,Void為即為空元組()
// 官方解釋
public typealias Void = ()
返回多個值
swift中允許返回多個值,利用元組即可
/**
* 例子1:不含標簽的元組返回
*/
func networkStatus() -> (Int, String) {
(404, "Not Found") // 方式1
// (status:404, msg:"Not Found") // 方式2
}
print(networkStatus())
// 結(jié)果:(404, "Not Found") [無論方式1 or 方式2都一樣]
/**
* 例子2:含標簽的元組返回
*/
func sumAndAvg(number1:Double, number:Double) -> (sum:Double, avg:Double) {
let sum = number1 + number2
let avg = sum / 2.0
return (sum:sum, avg:avg)
}
print(sumAndAvg(number1: 1.1, number2:5.1))
// 結(jié)果:(sum:6.2, avg:3.1)
修改標簽
swift提倡代碼的閱讀星,因此允許修改標簽。
即對外使用最前面的標簽,對里使用最后面的標簽。且只允許同時并存使用兩個標簽
func work(at time:Int) {
// 為了語time?""
print("It's \(time) o'clock.It's time to work")
}
work(at: 9) // 為了語義通順,用at
inout參數(shù)(引用傳遞)
var numner = 10
func increaseNumber(number:inout Int) {
number += 1
}
increaseNumber(number: &number)
print(number)
// 結(jié)果:11
Inout 關(guān)鍵詞只能用于允許允許修改的容易,如var。而像let這種是不允許進行修改的。
1. 例子
交換兩個值的方式
var number1 = 1
var number2 = 2
// 方法1:用inout參數(shù)+中間變量
func exchange(_ v1:inout Int, _ v2:inout Int) {
le tem = v1
v1 = v2
v2 = tem
}
exchange(&number1, &number2)
// 方式2:用inout參數(shù)+元組(這個方式比較巧)
func exchange(_ v1:inout Int, _ v2:inout Int) {
(v2, v1) = (v1, v2)
}
// 方式3:用官方自帶API
swap(&number1, &number2)
可變參數(shù)
func customPrint(_ intNum:Int...) {
print(intNum)
}
customPrint(1, 2, 3, 4)
注意點:
可變參數(shù)后面的參數(shù)標簽不可省略
/**
* 示范:在可變參數(shù)后面的參數(shù)標簽不可省略
*/
func customPrint(sequeue:Int..., name:String) { // name標簽不可省略
print(sequeue, name)
}
customPrint(sequeue:1,2,3,4, name:""66666)
// 結(jié)果:1 2 3 4 6666
函數(shù)重載
跟Java的重載概念一致。
重載規(guī)則:
參數(shù)類型不同
參數(shù)個數(shù)不同
參數(shù)便簽名稱不同
/**
* 示范:參數(shù)類型不同
*/
func sum(v1:Double, v2:Int) -> Int {
Int(v1) + v2
}
func sum(v2:Int, v3:Int) -> Int {
v2 + v3
}
/**
* 示范:參數(shù)個數(shù)不同
*/
func sum(_ v1:Int, _ v2:Int) -> Int {
v1 + v2
}
func sum(_ v1:Int, _ v2:Int, _ v3:Int) -> Int {
v1 + v2 + v3
}
/**
* 示范:參數(shù)標簽不同
*/
func sum(v1:Int, v2:Int) -> Int {
v1 + v2
}
func sum(v2:Int, v3:Int) -> Int {
v2 + v3
}
注意:
返回類型不能作為重載的依據(jù)(由于在調(diào)用的時候,編譯會混淆,不知道該調(diào)用哪個函數(shù))
func sum(_ v1:Int, _ v2:Int) -> Int {
v1 + v2
}
func sum(_ v1:Int, _ v2:Int) -> Double {
Double(v1 + v2)
}
// 無法編譯通過,會有歧義
高階函數(shù)
在返回結(jié)果值為另一個函數(shù)的函數(shù)稱為高階函數(shù)
/**
* 高階函數(shù)
*/
// 此處(Int) -> Int 為該walk函數(shù)的返回值
func walk(_ isForward:Bool) -> ((Int) -> Int) {
isForward ? forward: back
}
func forward(step:Int) -> Int {
return step
}
func back(step:Int) -> Int {
return -step
}
// 調(diào)用方式1
print(walk(false)(1))
// 調(diào)用方式2
var customForward = walk(false)
print(customForward(1))
注意:
函數(shù)返回值不允許帶有標簽。就算是函數(shù)類型的結(jié)果值也不予許帶
/**
* 錯誤釋放
*/
// (Int) -> Int 不予許變成 (step:Int) -> Int。函數(shù)返回值不允許帶標簽
func walk(_ isForward:Bool) -> ((step:Int) -> Int) {
isForward ? forward: back
}
func forward(step:Int) -> Int {
return step
}
func back(step:Int) -> Int {
return -step
}
嵌套函數(shù)
函數(shù)內(nèi)嵌套函數(shù)
func walk(isForward:Bool, step:Int) {
func fowrd(_ step:Int) {
print(step)
}
func back(_ step:Int) {
print(step)
}
isForward ? forward(step) : back(step)
}
walk(isForward:true, step:1)
// 結(jié)果:1