待处理

Swift-闭包Closure

2020-11-18  本文已影响0人  守护地中海的花

先复习一下函数Swift-func

闭包可以定义一个函数

闭包可以定义一个函数

闭包可以定义一个函数

闭包概念:

演绎过程:

typealias Fn = (Int) -> Int
func getFn() -> Fn {
    var num = 10
    func plus(i: Int) -> Int {
        num += I
        return num
    }
    return plus//这是函数哦 不能是实现
    return plus(I:)
}

var fnx = getFn()
print(fnx(1))

简易一下程序

func getFn() -> Fn {
    var num = 10
    return {
        num += $0
        return num
    }
}

类比一个类的实例对象

class Closure {
    var num = 0
    func plus(_ i:Int) -> Int {
        num += I
        return num
    }
}
var cs1 = Closure()
print(cs1.plus(1))

闭包

Swift中,可以通过func定义一个函数 也可以通过闭包表达式定义一个函数

func add(_ v1: Int,_ v2: Int) -> Int {
    v1 + v2
}
var fx = {
    (v1: Int,v2: Int) -> Int in
    return v1 + v2
}
print(fx(10,20))
print(fx)
print(add)

把实现带着随便测试
var fx1 = {
    (v1: Int,v2: Int) -> Int in
    return v1 + v2
}(10,10)
print(fx1)
image.png

闭包作为参数(闭包简写真特么简 其实不简写容易读)

//exec定义
func exec(v1: Int,v2: Int,fn:(Int,Int) -> Int) {
    print(fn(v1,v2))
}

实现exec方法

var fn:(Int,Int)->Int = add
exec(v1: 10, v2: 10, fn: fn)
//写全一点
exec(v1: 10, v2: 20, fn: {
    (v1: Int,v2: Int) -> Int in
    return v1 + v2
})
//省略return
exec(v1: 10, v2: 20, fn: {
    (v1: Int,v2: Int) -> Int in
    v1 + v2
})
//省略参数
exec(v1: 10, v2: 20, fn: {
    v1,v2 -> Int in
    v1 + v2
})
//省略返回值
exec(v1: 10, v2: 20, fn: {
    v1,v2  in
    v1 + v2
})
//下标
exec(v1: 10, v2: 10, fn: {
    $0 + $1
})
//一步到位了靠
exec(v1: 10, v2: 10, fn: +)

尾随闭包

func exec1(fn:(Int,Int) -> Int) {
    print(fn(1,2))
}
exec1(fn: {
    (v1: Int,v2: Int) -> Int in
    return v1 * v2
})
exec1{
    (v1: Int,v2: Int) -> Int in
    return v1 * v2
}
......下面同样可以省略 自己搞吧

自动闭包(语法真鸡贼)

后面在搞吧 语法真特么难懂太简易了

func getFirstPositive (_ v1: Int,_ v2: Int) -> Int {
    return v1 > 0 ?v1 : v2
}
print(getFirstPositive(10, 20))
print(getFirstPositive(-2, 20))
print(getFirstPositive(0, -4))
//改成函数类型的参数,可以让v2延迟加载
func getFirstPositive(_ v1: Int,_ v2: () -> Int) -> Int? {
    return v1 > 0 ? v1: v2()
}
print(getFirstPositive(-4, {20})!)

func getFirstPositive1(_ v1: Int,_ v2:@autoclosure () -> Int) -> Int? {
    return v1 > 0 ? v1: v2()
}
print(getFirstPositive1(-4, 20)!)

参数修饰符保持一致

//如果返回值是函数类型,那么参数的修饰要保持统一
func total(_ num: Int) -> (inout Int) -> Void {
    func plus(v: inout Int) {
        v += num
    }
    return plus
}
var vvvv = 5
total(20)(&vvvv)
print(vvvv)

忽略参数(语法真鸡贼)

func exec2(fn:(Int ,Int) -> Int) {
    print(fn(1,2))
}
exec2{_,_ in 100}

练习

var functions:[() -> Int] = []
for i in 1...3 {
    functions.append{I}
}
for i in functions {
    print(i)
}
class Closure2 {
    var i: Int
    init(_ i: Int) {
        self.i = I
    }
    func get() -> Int {
        return I
    }
}
var clses:[Closure2] = []
for i in 1...3 {
    clses.append(Closure2(i))
}
for i in clses {
    print(i.get())
}

补充案例

案例一:网络请求 省略参数 逃逸闭包

image.png

Function types cannot have argument labels; use '_' before 'result'
从Swift3.0开始, 苹果官方建议方法中函数类型的参数不要带参数名称, 尤其是不能带外部参数名.
解决方案:

class func requestData(parameters: [String:Any]?,finishedCallBack:(_ result:Any)->()) {
    finishedCallBack("回调请求内容")
}

新的问题


image.png

逃逸闭包捕获非逃逸闭包
captures:捕获
Escaping:逃逸


image.png

语法小计

NetworkTools.requestData(url: requestUrl, method: .post, parameters: parameters) { response, status in
    
}
NetworkTools.requestData(url: requestUrl, method: .post, parameters: parameters) { (response, status) in
    
}
上一篇 下一篇

猜你喜欢

热点阅读