Swift——3、函數(shù)

函數(shù)的定義

Demo

定義

v1 、v2:參數(shù)
Double Int 返回值

  • 形參默認(rèn)是let,也必須是let

無返回值

  • 可以是void、()空元祖、或者什么都不寫
無返回值

隱式返回

  • 如果整個(gè)函數(shù)體是一個(gè)單一表達(dá)式,那么函數(shù)會(huì)隱式返回這個(gè)表達(dá)式
隱式返回

返回元組:實(shí)現(xiàn)多返回值

返回元組

函數(shù)的文檔注釋

注釋

參數(shù)標(biāo)簽

為了整理的讀取通順,參數(shù)標(biāo)簽對(duì)外使用,time對(duì)內(nèi)使用


參數(shù)標(biāo)簽

默認(rèn)參數(shù)值

  • 參數(shù)可以有默認(rèn)值
默認(rèn)參數(shù)值
  • C++的默認(rèn)參數(shù)值有一個(gè)限制,必須從右往左設(shè)置,由于Swift擁有參數(shù)標(biāo)簽,因此并沒有此類限制
  • 但是在省略參數(shù)標(biāo)簽是,需要特別注意,避免出錯(cuò)
圖片.png

可變參數(shù)

  • Int...代表可變參數(shù)
可變參數(shù)
  • 一個(gè)函數(shù)最多只有一個(gè)可變參數(shù)
  • 緊跟在可變參數(shù)后邊的參數(shù)不能省略參數(shù)標(biāo)簽
不能省略參數(shù)標(biāo)簽

Swift自帶的print函數(shù)

  • Any...可變參數(shù)、separator 間隔 、 terminator 結(jié)尾
print函數(shù)

輸入輸出函數(shù)

  • 可以使用inout定義一個(gè)輸入輸出參數(shù): 可以在函數(shù)內(nèi)部修改外部實(shí)參的值
  • 可變參數(shù)不能標(biāo)記為inout
  • inout參數(shù)不能有默認(rèn)值
  • inout參數(shù)的本質(zhì)是地址傳遞(引用傳遞)
  • inout參數(shù)只能傳入可以被多次賦值的
// 利用中間量交換兩個(gè)值
func swapValues(_ v1: inout Int, _ v2: inout Int) {
    let tmp = v1
    v1 = v2
    v2 = tmp
}

var num1 = 10
var num2 = 20
swapValues(&num1, &num2)

//利用元祖交換兩個(gè)值
func swapValues(_ v1: inout Int, _ v2: inout Int) {
    (v1, v2) = (v2, v1)
}

//在內(nèi)部修改外部的值
var number = 10

func add(_ num: inout Int) {
    num = 20
}

add(&number)

print(number)

函數(shù)重載

  • 函數(shù)名相同
  • 參數(shù)個(gè)數(shù)不同 || 參數(shù)類型不同 || 參數(shù)標(biāo)簽不同
函數(shù)重載
  • 注意: 返回值類型與函數(shù)重載無關(guān)
返回值類型
  • 默認(rèn)參數(shù)值和函數(shù)重載一起使用產(chǎn)生二義性時(shí),編譯器不會(huì)報(bào)錯(cuò)(在C++)中會(huì)報(bào)錯(cuò)
二義性
  • 可變參數(shù)、省略參數(shù)標(biāo)簽、函數(shù)重載一起使用產(chǎn)生二義性,編譯器可能會(huì)報(bào)錯(cuò)
報(bào)錯(cuò)

內(nèi)聯(lián)函數(shù)

  • 如果開啟了編譯器優(yōu)化(release模式默認(rèn)會(huì)開啟優(yōu)化),編譯器會(huì)自動(dòng)將某些函數(shù)變成內(nèi)聯(lián)函數(shù)
  • 將函數(shù)調(diào)用展開成函數(shù)體
圖片.png
func test() {
    print("test")
}

test() // 在此打斷點(diǎn),運(yùn)行代碼,會(huì)發(fā)現(xiàn),”test“已經(jīng)被打印出來
  • 哪些函數(shù)不會(huì)被內(nèi)聯(lián)

    • 函數(shù)體比較長
    • 包含遞歸調(diào)用
    • 包含動(dòng)態(tài)派發(fā)

    @inline

    • 在Release模式下,編譯器已經(jīng)開啟優(yōu)化,會(huì)自動(dòng)決定哪些函數(shù)需要內(nèi)聯(lián),因此沒必要使用@inline
//永遠(yuǎn)不會(huì)被內(nèi)聯(lián)(即使開啟了編譯器優(yōu)化)
@inline(never) func test() {
    print("test")
}

//開啟編譯器優(yōu)化后,即使代碼很長,也會(huì)被內(nèi)聯(lián)(遞歸調(diào)用函數(shù)、動(dòng)態(tài)派發(fā)的函數(shù)除外)兩個(gè)下劃線
@inline(__always) func test() {
    print("test")
}

函數(shù)類型

  • 每一個(gè)函數(shù)都是有類型的,函數(shù)類型有形式參數(shù)類型、返回值類型組成
func test() {} // () -> Void 或者 ()-> ()

func sum(a: Int, b: Int) -> Int {
    a+b
} // (Int, Int) -> Int

//定義變量
var fn:(Int, Int) -> Int = sum()
fn(2, 3) // 5,調(diào)用c時(shí)不需要參數(shù)標(biāo)簽

  • 函數(shù)類型作為函數(shù)參數(shù)
作為函數(shù)參數(shù)
  • 函數(shù)類型作為函數(shù)返回值

    • 返回值是函數(shù)類型的函數(shù),叫做高階函數(shù)
作為函數(shù)返回值

_ forward: Bool 是參數(shù)
-> (Int) -> Int 是返回值

typealias 別名

  • typealias 用來給類型起別名
  • 按照Swift標(biāo)準(zhǔn)庫的定義,Void就是空元祖()
    public typealias Void = ()
typealias

嵌套函數(shù)

  • 將函數(shù)定義在函數(shù)內(nèi)部,不希望外部直接調(diào)用
嵌套函數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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