闭包

闭包是独立的功能块,可以在代码中传递和使用。Swift中的闭包类似于C和Objective-C中的代码块,闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。这称为close over这些常量和变量。Swift为您处理捕获的所有内存管理。

全局和嵌套函数实际上是闭包的特殊情况。闭包采用以下三种形式之一

全局函数是具有名称且不捕获任何值的闭包。

嵌套函数是具有名称的闭包,可以从其闭包函数捕获值。

闭包表达式是用轻量级语法编写的未命名的闭包,可以从其周围的上下文中捕获值。

闭包表达式语法

闭包表达式语法具有以下一般形式:

{ (parameters) -> return type in

    statements

}

尾随闭包

如果您需要将闭包表达式作为函数的最终参数传递给函数,并且闭包表达式很长,那么将其写为尾随闭包可能会很有用。您可以在函数调用的括号后面编写尾随闭包,即使尾随闭包仍然是函数的参数。使用尾随闭包语法时,不要在函数调用中为第一个闭包编写参数标签。一个函数调用可以包括多个结尾的闭包。

当闭包足够长而无法单行内联写入时,尾随闭包最有用。例如,Swift的Array类型有一个map(_:)方法,该方法将闭包表达式作为其单个参数。对数组中的每个项目调用一次闭包,并为该项目返回一个替代的映射值(可能是其他类型的)。通过在传递给闭包的代码中编写代码,可以指定映射的性质和返回值的类型map(_:)。

将提供的闭包应用于每个数组元素后,该map(_:)方法将返回一个包含所有新映射值的新数组,其顺序与原始数组中相应值的顺序相同。

特性

闭包可以从定义它的周围上下文中捕获常量和变量。然后,闭包可以从其主体内部引用和修改这些常量和变量的值,即使定义常量和变量的原始范围不再存在。

在Swift中,最简单的可以捕获值的闭包形式是嵌套函数,它写在另一个函数的主体内。嵌套函数可以捕获其外部函数的任何自变量,还可以捕获在外部函数内定义的任何常量和变量。

作为一种优化,Swift可能会捕获并存储值的副本,如果该值未由闭包更改,并且该值在创建闭包后也未更改。

Swift也可以处理不再需要变量时涉及的所有内存管理。如果将闭包分配给类实例的属性,并且闭包通过引用该实例或其成员来捕获该实例,则将在闭包和实例之间创建一个强引用。Swift使用捕获列表来打破这些强引用。

闭包是引用类型

将函数或闭包分配给常量或变量时,实际上就是在将该常量或变量设置为对该函数或闭包的引用

逃逸闭包

当闭包作为函数的参数传递给闭包时,闭包被认为是对函数的转义,但是在函数返回后被调用。声明将闭包作为其参数之一的函数时,可以@escaping在参数的类型之前编写以指示允许对闭包进行转义。

闭包可以逃脱的一种方法是将其存储在函数外部定义的变量中。例如,许多启动异步操作的函数都将闭包参数用作完成处理程序。该函数在开始操作后返回,但是直到操作完成后才调用闭包-该闭包需要转义,稍后再调用。

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

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

    completionHandlers.append(completionHandler)

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容