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)")
})