第七章 闭包

作者: 运柱 | 来源:发表于2017-07-13 21:05 被阅读0次

c++没有闭包,swift有闭包。c++有些类似的概念是Lambda函数,但是闭包概念更丰富,更完善,更灵活。

闭包表达式语法:

{  (parameters)  ->  returnType in

statements

} //闭包参数不能设置默认值,可以是inout参数,也可以是可变参数。

闭包根据上下文可以推断类型,可以省略参数和返回值类型,单行表达式闭包还可以省略return关键字,对于内联闭包还可以省略参数名称,直接用$0,$1,$2来表示参数。但是个人认为,为了代码可读性,上面的方便还是不要省略了。

尾随闭包

func someFunctionThatTakesAClosure(closure: ()  -> Void) {

//函数体部分

} //函数是以函数类型作为参数,闭包表达式是作为最后一个参数传递给函数

//这时可以采用尾随闭包

//以下不使用尾随闭包进行函数调用

someFunctionThatTakesAClosure() {

//闭包主体部分

})

//以下是使用尾随闭包进行函数调用

someFunctionThatTakesAClosure() {

//闭包主体部分

}

swift中函数和闭包是引用类型,c++中函数是指针,swift没有指针,只有值类型和引用类型。swift的所有基本类型Int、Double、Float、Bool、String、Array、Dictionary都是值类型,结构体和枚举也是值类型,但类是引用类型,这点和c++不同。将一个类实例赋值给两个变量,其实是对这个实例的两次引用,任何修改都会改变另外一个变量的值。

逃逸闭包

当一个闭包作为参数传递到一个函数,但是这个闭包在函数返回之后才被执行,这个闭包可以采用逃逸闭包实现。逃逸闭包里需显式引用self。

var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {

completionHandlers.append(completionHandler)

}

func someFunctionWithNonescapingClosure(closure: () -> Void) {

closure()

}

class SomeClass {

var x = 10

func doSomething() {

someFunctionWithEscapingClosure { self.x = 100 }

someFunctionWithNonescapingClosure { x = 200 }

}

}

let instance = SomeClass()

instance.doSomething()

print(instance.x)

// 打印出 "200"

completionHandlers.first?()

print(instance.x)

// 打印出 “100"

相关文章

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 第七章 闭包

    c++没有闭包,swift有闭包。c++有些类似的概念是Lambda函数,但是闭包概念更丰富,更完善,更灵活。 闭...

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • 闭包-Closures [swift 5.1]

    闭包的语法 尾随闭包 闭包逃离 自动闭包

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

网友评论

    本文标题:第七章 闭包

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