1. 函数的基本格式和使用
func sum(x:Int, y:Int) -> Int {
return x + y
}
let result = sum(x: 5, y: 6)
func sum2(num1 x:Int, num2 y:Int) -> Int {
return x + y
}
let result2 = sum2(num1: 3, num2: 4)
func sum3(_ x:Int, _ y:Int) -> Int {
return x + y
}
let result3 = sum3(4, 5)
func sum4(x:Int = 2, y:Int = 4) -> Int {
return x + y
}
var result4 = sum4()
result4 = sum4(x:4)
result4 = sum4(y:5)
result4 = sum4(x:4, y:5)
2. 无返回值函数
func sum5() {
print(#function)
}
func sum6() -> () {
print(#function)
}
func sum7() -> Void{
print(#function)
}
3. 闭包和关键字in
//MARK: 闭包 在swift中函数也是对象
//swift中,函数式特殊的闭包
//应用场景:1.异步执行完成回调
//应用场景:2.控制器间回调
//应用场景:3.自定义视图回调
//注意事项: 包含self时,注意循环引用
func sum8(x:Int, y:Int) -> Int {
return x + y
}
//(Int, Int) -> Int
//使用常量记录函数
let results = sum8
print(results(40, 50))
//1. 最简单的闭包--类型 () -> () 没有参数,没有返回值的匿名函数
let clourse1 = {
print("简单闭包")
}
//执行闭包
clourse1()
//2. 标准闭包: 无参数,无返回值 :
//使用in关键字分割 无参无返回值,直接省略 () -> () in
//格式: { (参数) -> 返回值类型 in 代码实现 }
let clourse2 = { () -> () in
print("标准闭包")
}
//闭包执行--- let clourse2: () -> ()
clourse2()
//3. 有参无返回值的闭包
let clourse3 = { (x: Int) -> () in
print("有参无返回值的闭包")
}
//执行闭包--> let clourse3: (Int) -> ()
clourse3(3)
//4. 有参无返回值的闭包--简写
let clourse4 = { (x: Int) in
print("有参无返回值的闭包--简写")
}
//let clourse4: (Int) -> ()
clourse4(5)
//5. 无参,有返回值的闭包
let clourse5 = { () -> Int in
print("无参,有返回值的闭包")
return 100
}
//let clourse5: () -> Int
let a = clourse5()
//6. 有参,有返回值的闭包
let clourse6 = { (x: Int) -> Int in
print("有参,有返回值的闭包")
return 100
}
//let clourse6: (Int) -> Int
let b = clourse6(6)
3. 闭包应用之GCD线程间通信写法
DispatchQueue.global().async {
print("异步子线程")
DispatchQueue.main.sync(execute: {
print("回到主线程")
})
}
4.闭包(尾随闭包)值网络请求数据简单示例
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
loadData { (result, error) in
guard let result = result else {return}
print(result)
}
}
func loadData(callBack: @escaping ((_ result: [String: Any]?, _ error: Error?) -> ())) -> () {
DispatchQueue.global().async {
let json = [
"name":"zhouyu",
"age":16,
"blog":"https://blog.csdn.net/kuangdacaikuang",
"work":"iOS开发工程师"
] as [String : Any]
DispatchQueue.main.sync(execute: {
var error: Error?
callBack(json,error)
})
}
}
}
5.尾随闭包
//如果函数最后一个参数是闭包,函数参数可以提前结束,最后一个参数直接使用{}包装的闭包代码
//函数不带有额外参数传入
func loadData2 (callBack: @escaping ((_ result: [String: Any]?, _ error:Error?) -> ())) -> () {
let json = ["name":"zhouyu","age":28] as [String: Any]
var error:Error?
callBack(json,error)
}
//尾随闭包
loadData2 { (result, error) in
guard let result = result else { return }
print(result)
}
//函数带有额外参数传入
func loadData (userId: String, callBack: @escaping ((_ result: [String: Any]?, _ error:Error?) -> ())) -> () {
print(userId)
let json = ["name":"zhouyu","age":28] as [String: Any]
var error:Error?
callBack(json,error)
}
//尾随闭包
loadData(userId: "123456789") { (result, error) in
guard let result = result else { return }
print(result)
}
6. 闭包与循环引用 [weak self]
import UIKit
class ViewController: UIViewController {
var dataSoure:[String: Any]?
override func viewDidLoad() {
super.viewDidLoad()
loadData { [weak self] (result, error) in
guard let result = result else {return}
print(result)
self?.dataSoure = result
print(self?.dataSoure)
}
}
func loadData(callBack: @escaping ((_ result: [String: Any]?, _ error: Error?) -> ())) -> () {
DispatchQueue.global().async {
let json = [
"name":"zhouyu",
"age":16,
"blog":"https://blog.csdn.net/kuangdacaikuang",
"work":"iOS开发工程师"
] as [String : Any]
DispatchQueue.main.sync(execute: {
var error: Error?
callBack(json,error)
})
}
}
}
["name": "zhouyu", "age": 16, "blog": "https://blog.csdn.net/kuangdacaikuang", "work": "iOS开发工程师"]
Optional(["name": "zhouyu", "age": 16, "blog": "https://blog.csdn.net/kuangdacaikuang", "work": "iOS开发工程师"])
[weak self]
[unowned self]