前言
接上篇, 這篇聊一下 Swift中的 函數(shù), 閉包
一 函數(shù)
// MARK: -函數(shù)定義 格式 func 函數(shù)名(形參列表) -> 返回值類型 {}
func sum(a: Int, b: Int) -> Int {
return a + b
}
// MARK: - 外部參數(shù)
/**
- 外部參數(shù)就是在 形參前面加一個名字
- 外部參數(shù)不會影響函數(shù)內(nèi)部的細(xì)節(jié)
- 外部參數(shù)使用'_', 調(diào)用時 會忽略形參的名字
*/
func sum1(num1 x: Int, num2 y: Int) -> Int {
return x + y
}
func sum2(_ x: Int, _ y: Int) -> Int {
return x + y
}
// MARK: - 默認(rèn)值
/**
- 通過給參數(shù)設(shè)置默認(rèn)值, 在調(diào)用時候, 可以任意組合參數(shù), 如果不指定就使用默認(rèn)值
*/
func sum3(x: Int = 1, y: Int = 3) -> Int {
return x + y
}
/** 測試默認(rèn)值 調(diào)用
print(sum3()) => 4
print(sum3(x: 10, y: 30)) => 40
print(sum3(x: 10)) => 13
print(sum3(y: 30)) => 31
*/
// MARK: - 無返回值
/**
- 直接省略 () Viod
*/
func demo() {
print("直接省略")
}
二 閉包
func demo1() -> () {
/**
* 閉包中 參數(shù), 返回值, 實現(xiàn)代碼都寫在 {} 中
* 需要使用關(guān)鍵字 'in' 分割定義和實現(xiàn)
* {形參列表 -> 返回值類型 in // 實現(xiàn)代碼}
*/
// 1. 最簡單閉包
// () -> () 無參無返回值閉包, 連 'in' 也可以省略
let b = {
print("hello")
}
b()
// 2. 有參數(shù)無返回值閉包
// (Int, Int) -> ()
let b1 = { (a: Int, b: Int) -> () in
print(a + b)
}
b1(1, 99)
// 3. 有參數(shù)有返回值
// (Int, Int) -> Int
let b2 = { (x: Int, y: Int) -> Int in
return x * y
}
print(b2(10, 12))
}
// MARK: - 閉包作為函數(shù)的參數(shù)
// ( 閉包名:()->() ) -> ()
// Function types cannot have argument labels
// 函數(shù)類型不能有參數(shù)標(biāo)簽, (在Swift3中, 把閉包的參數(shù)名 取消了)
func loadData(success : @escaping(_ : [String]) -> ()) -> () {
let json = ["新聞", "圖片", "熱點(diǎn)"]
success(json)
}
//@noescape : 如果這個閉包是在這個函數(shù)結(jié)束前被調(diào)用,就是非逃逸的閉包(默認(rèn))。
//@escaping : 如果這個閉包是在函數(shù)執(zhí)行完后才被調(diào)用瑞佩,調(diào)用的地方超過了這函數(shù)的范圍姿现,所以叫逃逸閉包亏拉。
/*調(diào)用*/
// 尾隨閉包 : 如果函數(shù)最后一個參數(shù)是閉包, 函數(shù)參數(shù)可以提前結(jié)果, 最后一個參數(shù)直接使用 {} 包裝閉包的代碼
// (相當(dāng)于沒有參數(shù))
loadData { (result) in
print(result)
}
// 按照函數(shù)本身編寫結(jié)果
loadData(success: { (result) -> () in
print(result)
})
// 閉包與block相同, 也有循環(huán)引用, 推薦用 [weak self]
loadData { [weak self] (result) in
print(self?.view as Any)
print(result)
}
// MARK: - 網(wǎng)絡(luò)請求
func handleData(urlStr: String, completion: @escaping(String) -> ()) -> () {
let url0 = URL(string: urlStr)
guard let url = url0 else {
print("網(wǎng)址為空")
return
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {
print("網(wǎng)絡(luò)請求失敗 \(String(describing: error))")
return
}
let html = String(data: data, encoding: .utf8)
completion(html!)
}.resume()
}
/*調(diào)用*/
handleData(urlStr: "https://wwww.baidu.com") { (result) in
print(result)
}
Swift 基礎(chǔ) 先介紹三篇, 以后有機(jī)會再寫.
以 上 !