美文网首页iOS - Swift
Swift Closure (闭包) 总结

Swift Closure (闭包) 总结

作者: 木叔勒 | 来源:发表于2016-09-03 13:19 被阅读98次

Closure 的定义网上也比较多比较全,下面所写不会具体介绍语法,只做简单归纳、实例阐述。

一、归纳属性闭包

1.常见的完整的属性闭包写法
//定义
var fun1 = {
    (a:Int,b:Int) -> Int in
    return a+b
}
//调用
print(fun1(1,1))
2.定义后立即调用
var fun2 = {
    (a:Int,b:Int) -> Int in
    return a+b
}(1,2)
3.闭包的类型实际上是一种函数类型,根据接收变量的类型来自动推到闭包对应的类型
var fun3:(Int,Int)->Int = {
    (a,b) in
    return a+b
}
print(fun3(1,3))
4.闭包的类型实际上是一种函数类型,根据实参的类型和返回值来自动推到闭包对应的类型
var fun4 = {
    a,b in
    return a+b
}(1,4)

5.省略return语句
var fun4 = {
    a,b in
    a+b
}(1,4)

6.省略形参名和in关键字(可以是用$0,$1...来应用对应参数)
var fun5:(Int,Int)->Int = {
    $0 + $1
}
print(fun5(1,5))

var fun6 = {
    $0 + $1
}(1,5)

二、Closure 在函数中的应用

1.尾随闭包

定义:闭包表达式可以作为函数的参数传递,如果闭包表达式很长,就会影响程序的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。

func showPlus(opr:String,fun:(Int,Int)->Int){
    switch (opr) {
    case "+" :
        print("1 + 1 = \(fun(1,1))")
    default:
        print("1 - 1 = \(fun(1,1))")
    }
}

//正常调用
showPlus(opr: "+", fun: {(a:Int,b:Int)->Int in return a+b})

//尾随闭包
showPlus(opr: "-"){(a:Int,b:Int)->Int in return a-b}

2.捕获值

闭包可以访问本体之外的变量或常量,函数和闭包都是引用类型

func makeIncrementer(forIncrement amount: Int)->(Void)-> Int{
    var runningTotal = 0
    func incrementer()->Int{
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

let funMI = makeIncrementer(forIncrement: 10)
funMI()
funMI()
funMI()
3.非逃逸闭包

定义:闭包closureHandler作为一个参数传递给一个函数的时候,funcClosure函数返回了才执行闭包,我们就说闭包逃逸了。当我们用@noescope修饰闭包时,该闭包的生命周期不能超出该函数,同时不能被中的其他闭包捕获。假如给closureHandler加上@noescope修饰就会报错

var closureArray: [() -> Void] = []
func funcClosure(closureHandler: () -> Void) {
    closureArray.append(closureHandler)
}

5.自动闭包

将表达式包装成闭包,为了不会浪费资源选择性求值,调用方式不变,参数写法不同

func verifyidentity(action1:Bool, action2:Bool){

}

func isAction1()->Bool{
    print("isAction1 is action")
    return true
}

func isAction2()->Bool{
    print("isAction2 is action")
    return true
}

verifyidentity(action1: isAction1(), action2:isAction2())

三、回调实例

class A{
    //可以用关键字typealias定义一个公共的Closure,不需要理解,就下面这种定义就行了
    typealias Block = (wu:NSString,dan:NSString)->()
    var block:Block
    
    init() {
        self.block = {
            name,dan in
            print(name)
        }
        
        print("函数已经结束")
    }
    
}

class B{
    
    var a:A?
    
    
    func action(){
        self.a?.block(wu: "wudanfeng",dan: "10")
    }
}


var a = A()
var b = B()
b.a = a
b.action()

相关文章

  • Swift Closure (闭包) 总结

    Closure 的定义网上也比较多比较全,下面所写不会具体介绍语法,只做简单归纳、实例阐述。 一、归纳属性闭包 1...

  • Swift5.0 - day4-闭包、属性、方法、下标

    一、闭包 1.1、闭包表达式(Closure Expression)在 Swift 里面可以通过函数 func 定...

  • Swift 5.3 - SE-0279 Multiple Tra

    在最初 Swift 的定义中,当方法的最后一个参数为闭包时,称该闭包为尾随闭包(trailing closure)...

  • Swift closure闭包

    究竟什么是Closure? 说的通俗一点,一个函数加上它捕获的变量一起,才算一个closure //MARK: -...

  • swift:Closure 闭包

    @noescape @autoclosure @autoclosure(escaping)

  • Swift Closure闭包

    函数也是一种闭包 console log 如下 闭包表达式 console log 如下 闭包中的参数类型推断 c...

  • swift 闭包(closure)

    闭包:就是一个函数和它所捕获的变量/常量环境组合起来,称为闭包。1.一般定义在函数内部的函数。2.一般它捕获的是外...

  • Swift 闭包

    @Author Swift 闭包(Closure) 闭包是一种可以在代码中作为参数传递,自含的功能块。 闭包类似于...

  • [Swift5.1] 7-闭包

    闭包表达式(Closure Expression) 在Swift中,可以通过func定义一个函数,也可以通过闭包表...

  • Swift底层原理探索5----闭包

    闭包表达式(Closure Expression) 在Swift中,可以通过func定义一个函数,也可以通过闭包表...

网友评论

    本文标题:Swift Closure (闭包) 总结

    本文链接:https://www.haomeiwen.com/subject/ecikettx.html