Swift-函數(shù)調(diào)用

函數(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ī)則:

  1. 參數(shù)類型不同

  2. 參數(shù)個數(shù)不同

  3. 參數(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容