Swift函數(shù)

Swift函數(shù)

一.函數(shù)

1.函數(shù)定義

  • 函數(shù)的定義
    • 格式 func 函數(shù)名(行參列表) -> 返回值 {代碼實現(xiàn)}
    • 調用 let result = 函數(shù)名(參數(shù)1: 值1, 參數(shù)2: 值2...)
func sum(x: Int, y: Int) -> Int {
    return x + y
}

// Swift 1.0 `sum(10, 50)`
// Swift 2.0 `sum(10, y: 50)`
// SWift 3.0 `sum(x: 10, y: 50)`
print(sum(x: 10, y: 50))

2.函數(shù)的外部參數(shù)

  • 外部參數(shù)
// MARK: - 函數(shù)的外部參數(shù)
// - 在形參名前再增加一個外部參數(shù)名,能夠方便調用人員更好地理解函數(shù)的語義
func sum1(num1 x: Int, num2 y: Int) -> Int {
    return x + y
}
  • 省略外部參數(shù)
// - 在形參前使用 `_`,表示外部參數(shù)能夠省略,更適合其他語言的程序員的習慣
func sum2(_ x: Int, _ y: Int) -> Int {
    return x + y
}

3.函數(shù)的默認值

  • 定義帶默認值的函數(shù)
// MARK: - 函數(shù)的默認值
func sum3(x: Int = 20, y: Int = 30) -> Int {
    return x + y
}
  • 調用帶默認值的函數(shù)

說明:包含默認值的函數(shù)可以不用傳遞,并且可以任意組合

// 默認值
print(sum3())
print(sum3(x: 10, y: 20))
print(sum3(x: 1))
print(sum3(y: 1))
  • 函數(shù)格式小結

    • 包含默認值的函數(shù)可以不用傳遞,并且可以任意組合
    • _ 可以忽略外部參數(shù),與其他語言的函數(shù)風格更加類似
    • 外部參數(shù) 供外部調用使用,形參 在函數(shù)內部使用

4.沒有返回值

  • 沒有返回值的函數(shù),一共有三種寫法
    • 省略
    • ()
    • Void
// MARK: - 沒有返回值
/**
 Swift 中支持三種沒有返回值的情況

 - 省略
 - ()
 - Void

 返回值的格式主要應用于閉包
 */
func demo1() {
    print(#function)
}

func demo2() -> () {
    print(#function)
}

func demo3() -> Void {
    print(#function)
}

二.閉包

OC 中 Block 概念回顧

  • 閉包類似于 OC 中的 Block
    • 預先定義好的代碼
    • 在需要時執(zhí)行
    • 可以當作參數(shù)傳遞
    • 可以有返回值
    • 包含 self 時需要注意循環(huán)引用

1.閉包的定義

  • 定義一個函數(shù)
//: 定義一個 sum 函數(shù)
func sum(x: Int, y: Int) -> Int {
    return x + y
}

// 定義一個指向函數(shù)的常量
// 在 Swift 中函數(shù)本身就可以當作參數(shù)被定義和傳遞
let sumFunc = sum

// 執(zhí)行函數(shù)常量
print(sumFunc(x: 10, y: 30))
  • 閉包的四步演練
// 1> 最簡單的閉包
let myBlock1 = {
    print("hello block")
}

myBlock1()

// 2> 閉包的完整寫法,閉包的所有內容都包含在 {} 中
// `in` 用于區(qū)分閉包的參數(shù)和實現(xiàn)代碼
let myBlock2 = { () -> () in
    print("hello myBlock2")
}

myBlock2()

// 3> 帶參數(shù)的閉包
let myBlock3 = { (x: Int, y: Int) -> () in
    print(x + y)
}
myBlock3(10, 20)

// 4> 帶返回值的閉包
let myBlock4 = { (x: Int, y: Int) -> Int in
    return x + y
}

print(myBlock4(10, 50))

2.閉包使用

(1)GCD

  • 異步加載數(shù)據(jù)
/// GCD 模擬異步加載數(shù)據(jù)
func loadData() -> () {

    // GCD 概念:將任務添加到隊列,并且指定任務的執(zhí)行函數(shù)
    // 翻譯 -> `隊列` 調度 `任務` 以 `同步/異步` 方式執(zhí)行
    DispatchQueue.global().async {

        print("異步耗時加載數(shù)據(jù) \(Thread.current())")

        let json = ["新聞1", "新聞2", "出大事了"]

        DispatchQueue.main.async(execute: {

            print("主線程回調 \(Thread.current()) \(json)")
        })
    }

    print("come here")
}

(2)添加回調閉包

/// GCD 模擬異步加載數(shù)據(jù)
func loadData(completion: @escaping ([String])->()) -> () {

    // GCD 概念:將任務添加到隊列,并且指定任務的執(zhí)行函數(shù)
    // 翻譯 -> `隊列` 調度 `任務` 以 `同步/異步` 方式執(zhí)行
    DispatchQueue.global().async {

        print("異步耗時加載數(shù)據(jù) \(Thread.current())")

        let json = ["新聞1", "新聞2", "出大事了"]

        DispatchQueue.main.async(execute: {

            print("主線程回調 \(Thread.current()) \(json)")

            completion(json)
        })
    }

    print("come here")
}

@escaping:逃逸性閉包,標示該閉包會在其他方法/閉包內部被執(zhí)行

(3)尾隨閉包

  • 尾隨閉包,如果閉包是最后一個參數(shù),可以提前結束函數(shù),最后一個參數(shù)直接使用 {} 閉包的方式傳遞
// 尾隨閉包寫法
// - 如果閉包是最后一個參數(shù),函數(shù)可以提前結束,并且在末位直接追加 `{}` 閉包
// - 尾隨閉包可以省略參數(shù)名
loadData { (result) in
    print("--- \(result)")
}

// 函數(shù)參數(shù)的寫法
loadData(completion: {result in
    print("--- \(result)")
})
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容