Swift5.1 - 函數(shù)(3)

1. 函數(shù)定義

  • 無返回值;
    func add(a: Int, b: Int) {
        return a + b
    }
  • 有返回值(使用 -> 來定義返回);
    func add(a: Int, b: Int) -> Int {
        return a + b
    }
  • 行參默認(rèn)是let,不能為var;
  • 隱式返回(只能在swift5.1及以上有效,只有一行代碼,默認(rèn)返回);
    func add(a: Int, b: Int) -> Int {
        a + b
    }
  • 返回元組:實(shí)現(xiàn)多值返回;
    func calculation(a: Int, b: Int) -> (add: Int, sub: Int, mul: Int) {
        return (a+b, a-b, a*b)
    }

    print(calculation(a: 3, b: 2))
    // (add: 5, sub: 1, mul: 6)

2. 函數(shù)文檔注釋

    /// 求和【慨述】
    /// 將2個(gè)整數(shù)進(jìn)行相加
    ///
    /// - Parameter a: 第一個(gè)整數(shù)
    /// - Parameter b: 第二個(gè)整數(shù)
    /// - Returens: 兩個(gè)整數(shù)的和
    ///
    /// - Notes: 傳入2個(gè)整數(shù)【批注】
    ///
    func add(a: Int, b: Int) -> Int {
        a + b
    }
  • 按 option + 鼠標(biāo)左鍵,點(diǎn)擊add


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

  • 參數(shù)的標(biāo)簽可以修改;
    func add(val1 a: Int, var2 b: Int) -> Int {
        a + b
    }

    add(val1: 1, var2: 2)
  • 用下劃線 _ 省略參數(shù)標(biāo)簽;
    func add(_ a: Int, _ b: Int) -> Int {
        a + b
    }

    add(1, 2)

4. 設(shè)置參數(shù)默認(rèn)值

    func add(a: Int = 0, b: Int) -> Int {
        a + b
    }

    print( add(b: 2) ) // 2

5. 可變參數(shù)

    func test(_ nums: Int...) -> Int {
        
        var sum = 0
        for num in nums {
            sum += num
        }
        return sum
    }

    print( test(1, 2, 3, 4) )  // 10
  • 一個(gè)函數(shù) 最多只能有1個(gè) 可變參數(shù);
  • 緊跟在可變參數(shù)后面的參數(shù),不能省略參數(shù)標(biāo)簽;


6. 輸入輸出參數(shù)

  • 使用 inout 定義一個(gè)輸入輸出參數(shù):可以在函數(shù)內(nèi)部修改外部參數(shù)的值;
    func swapV(v1: inout Int, v2: inout Int)  {
        (v2, v1) = (v1, v2)
    }

    var v1: Int = 10
    var v2: Int = 20
        
    swapV(v1: &v1, v2: &v2)
    print("v1 = \(v1), v2 = \(v2)")   // v1 = 20, v2 = 10
  • 可變參數(shù) 不能設(shè)置為 inout;
  • inout 參數(shù)不能設(shè)置 默認(rèn)值
  • inout 參數(shù)只能傳入可以被多次賦值的;
  • inout 參數(shù)本質(zhì)是 地址傳遞

7. 函數(shù)重載

函數(shù)重載的規(guī)則:

  1. 函數(shù)名相同;
  2. 參數(shù)個(gè)數(shù)不同、參數(shù)標(biāo)簽不同、參數(shù)類型不同;
    func add(a: Int, b: Int) -> Int {
        a + b
    }
    
    // 參數(shù)個(gè)數(shù)不同
    func add(a: Int, b: Int, c: Int) -> Int {
        a + b + c
    }
    
    // 參數(shù)類型不同
    func add(a: Int, b: Double) -> Int {
        a + Int(b)
    }
    
    // 參數(shù)標(biāo)簽不同
    func add(v1: Int, _ v2: Int) -> Int {
        v1 + v2
    }
  • 返回值類型 與函數(shù)重載無關(guān);

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

  • 如果開啟了編譯器優(yōu)化(release模式下,默認(rèn)開啟優(yōu)化),編譯器會(huì)自動(dòng)將某些函數(shù)編程內(nèi)聯(lián)函數(shù);
  • 將函數(shù)調(diào)用展開成函數(shù)體;


不會(huì)函數(shù)被自動(dòng)內(nèi)聯(lián):

  1. 函數(shù)體比較長(zhǎng);
  2. 包含遞歸調(diào)用;
  3. 包含動(dòng)態(tài)派發(fā);
  • @(inline) 的使用:
  1. @inline(never) 定義的函數(shù),永遠(yuǎn)不會(huì)被內(nèi)聯(lián)
    @inline(never) func test() {
        print("aaaa")
    }
  1. 在release模式下,編譯器會(huì)自動(dòng)開啟優(yōu)化,決定哪個(gè)函數(shù)自動(dòng)內(nèi)聯(lián),因此在編寫代碼時(shí)沒有必要使用 @(inline);

9. 函數(shù)類型

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

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

   // 定義函數(shù)類型變量
   var fun:(Int, Int) -> Int = add
   fun(2, 4) // 6
  • 函數(shù)類型作為 函數(shù)的參數(shù);
    func add(a: Int, b: Int) -> Int {
        a + b
    } // (Int, Int) -> Int
    
    func printAdd(_ add: (Int, Int) -> Int, _ a: Int, _ b: Int) {
        let sum = add(a, b)
        print(sum) // 30
    }

    printAdd(add, 10, 20)
  • 函數(shù)作為 返回值;
func next(_ input: Int) -> Int {
    input + 1
}

func previous(_ input: Int) -> Int {
    input - 1
}

func forward(_ forword: Bool) -> (Int) -> Int {
    forword ? next : previous
}

print( forward(false)(0) ) // -1
print( forward(true)(0) )  // 1
  • 返回值是函數(shù)類型的函數(shù),叫做高階函數(shù)

10. typealias

  • typealias 用來給類型起別名;
typealias Byte = Int8
typealias Char = Character
typealias Short = Int16
typealias Long = Int64

typealias Date = (year: Int, month: Int, day:Int)

func printDate(_ date: Date) {
    print(date.year)
    print(date.month)
    print(date.day)
}

printDate((2019, 9, 24))
  • Void是空元祖() ;
public typealias Void = ()

11. 嵌套函數(shù)

  • 將函數(shù)定義在函數(shù)內(nèi)部;
func forward(_ forword: Bool) -> (Int) -> Int {
    
    func next(_ input: Int) -> Int {
        input + 1
    }
    
    func previous(_ input: Int) -> Int {
        input - 1
    }

    return forword ? next : previous
}

print( forward(false)(0) ) // -1
print( forward(true)(0) )  // 1
最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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