2.3、闭包

//: Playground - noun: a place where people can play

import UIKit

/*

 闭包

 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。

 闭包相当于oc中的block,语法格式不一样,但作用是一样的

 主要是用于两个类之间的异步回调

 闭包可看作是int、float一样是一种数据类型,一种可以作为参数传递的数据类型

 格式:

 {

 (参数)-> 返回值类型 in

 执行语句

 }

 */

//(1)一般形式

letcalAdd:(Int,Int)->(Int) = {

    (a:Int,b:Int)->Intin

    returna + b

}

calAdd(100,200)

//(2)简化形式

//swift可以根据闭包上下文推断参数和返回值的类型,所以上面的例子可以简化如下

letcalAdd2:(Int,Int)->(Int) = {

    a,bin  // 也可以写成(a,b) in

    returna + b

}

calAdd2(10,20)//省略了返回箭头和返回值类型,以及参数周围的括号

//(3)单行表达式闭包可以隐式返回,如下,省略return

letcalAdd3:(Int,Int)->(Int) = {(a,b)ina + b }

calAdd3(20,30)

//(4)如果闭包没有参数,可以直接省略“in”

letcalAdd4:()->Int= {return1+2}

print("\(calAdd4())")

//(5)最简单闭包 这个是既没有参数也没有返回值,所以return和in都省略了

letcalAdd5:()->Void= {

    print("既没有参数也没有返回值,所以return和in都省略了")

}

//(6)闭包内嵌函数 函数表达式作为回调函数

letsumMethod:(_a:Int,_b:Int)->(Int) = {

    (a,b) -> (Int)in

    varb = b

    funcchangeValue() -> (Int) {

        b += a

        returnb

    }

    return changeValue()

}

sumMethod(3, 4)

//补充----------------神奇的下划线

//1.格式化数字字面量

//通过使用下划线能够提高数字字面量的可读性,比如:

letpaddedDouble =123.000_001

letoneMillion =1_000_000

//2.忽略元组的元素值

//当我们使用元组时,假设有的元素不须要使用。这时能够使用下划线将对应的元素进行忽略,比如:

lethttp404Error = (404,"Not Found")

let(_, errorMessage) =http404Error

//3.忽略区间值

letbase =3

letpower =10

varanswer =1

for _ in 1...power {//只是为了算多次,不关心区间每一项的值

    answer *= base

//    print(answer)

}

//4.忽略外部參数名

//(1).忽略方法的默认外部參数名

//在用法(类方法或者实例方法)时,方法的第二个參数名及兴许的參数名,默认既是内部參数名,又是外部參数名。假设不想提供外部參数名,能够在參数名前加入下划线来忽略外部參数名。

varcount:Int=0

funcincrementBy(amount:Int, numberOfTimes:Int){

    count+= amount * numberOfTimes

}

//在上面的代码中,方法incrementBy()中的numberOfTimes具有默认的外部參数名:numberOfTimes,假设不想使用外部參数名能够使用下划线进行忽略,代码能够写为(只是为了提高代码的可读性,一般不进行忽略):

varcount2:Int=0

funcincrementBy(amount:Int,_numberOfTimes:Int) {

    count2+= amount * numberOfTimes

}

//(2).忽略具有默认值的參数的外部參数名

//当函数(或者方法)的參数具有默认值时,Swift自己主动为该參数提供与參数名一致的默认外部參数名,因此在进行函数调用的时候,要提供默认參数名。能够使用下划线进行忽略默认外部參数名(可是不推荐忽略外部參数名。这主要是为了调用的时候能够方便地知道每一个參数的含义)

funcjoin(s1:String, s2:String, joiner:String=" ") ->String{

    returns1 + joiner + s2

}

join(s1:"hello", s2:"swift", joiner:"-")

//假设不想使用默认外部參数名,能够进行例如以下改动:

funcjoin2(s1:String, s2:String,_joiner:String=" ") ->String{

    returns1 + joiner + s2

}

join2(s1: "hello", s2: "world", "-")

join2(s1: "good", s2: "morning")

//(7)闭包内嵌闭包

letstrFormat:(_str1:String,_str2:String,_x:Int) ->Int= {

    (str1,str2,x)in

    letcalcute:(Int)->Int= {

        return$0

    }

    returncalcute(x)

}

strFormat("a", "b", 5)

//归纳:闭包类型是由参数和返回值决定,和函数一样

//(8)起别名 关键字 typealias声明一个闭包数据类型,类似于OC中的typedef别名

typealiasAddBlock = (Int,Int)->(Int)

letadd:AddBlock= {

    (a,b)in

    returna+b

}

add(5,5)

//(9)尾随闭包 若将闭包作为最后一个参数,可以省略参数标签,然后将闭包表达式写在函数调用括号后面

functestFunction(testBlock:()->Void){

    testBlock()

}

testFunction(testBlock: {

    print("正常写法")

})

testFunction(){

    print("尾随闭包写法")

}

testFunction {

    print("去掉括号的尾随闭包写法")

}

//值捕获

//闭包可以定义在其被定义的上下文中捕获常量或者变量,swift中可以捕获值的形式比如嵌套函数,也就是定义在其他函数的函数体内

//逃逸闭包

//当一个闭包作为参数传到一个函数中,需要这个闭包在函数返回之后才被执行,我们就称该闭包从函数中逃逸,一般如果闭包在函数体内涉及到异步操作,但函数却是很快就会执行完毕并返回的,闭包必须要逃逸掉,以便异步操作的回调

//逃逸闭包一般用于一部分回调函数的回调,比如网络请求成功的回调和失败的回调,语法仔函数的闭包行前加关键字@escaping

//示例1

funcrequestData(urlStrings :String,parameter : [String:Any],successData :@escaping(Any?)->(Void),failData :@escaping(Any?)->(Void)) {


    successData("请求成功")

    failData("请求失败")

    print("函数体")

}

//示例2

varcomletionHandle:()->String= {"喜欢😍看电影吗?"}

funcdoSomething(some:@escaping()->String){

    comletionHandle = some

}

doSomething{

    return "喜欢"

}

print(comletionHandle())

//自动闭包

//顾名思义,自动闭包是一种自动创建的闭包,封装一堆表达式在自动闭包中,然后将自动闭包作为参数传给函数。而自动闭包是不接受任何参数的,但可以返回自动闭包中表达式产生的值。

//自动闭包让你能够延迟求值,直到调用这个闭包,闭包代码块才会被执行

var array = ["I","have","a","apple"]

print(array.count)

letremoveBlock = {

    array.remove(at:3)

}

print(array.count)

print("执行代码块移除\(removeBlock())")

//打印出"执行代码块移除apple" 这里自动闭包返回了apple值

print(array.count)

//闭包捕获值

funcgetIncFunc(inc:Int) -> (Int) ->Int

{

    varmax =10

    funcincFunc(x :Int) ->Int{

        print("incFunc函数结束")

        returninc + x

//        max += 1

//        return max + x

    }

    // 当执行到这一句时inc参数就应该被释放了, 但是由于在内部函数中使用到了它, 所以它被捕获了

    // 同理, 当执行完这一句时max变量就被释放了,但是由于在内部函数中使用到了它, 所以它被捕获了

    print("getIncFunc函数结束")

    return incFunc

}

// 被捕获的值会和与之对应的方法绑定在一起, 同一个方法中的变量会被绑定到不同的方法中

print("-------------")

letincFunc =getIncFunc(inc:5)

print(incFunc(2))

print(incFunc(5))

letincFunc2 =getIncFunc(inc:5)

print(incFunc2(5))

print("-------------")

//练习page707

//1、哪个句子最好描述一个闭包?3

//A最后一个函数在swift文件中。

//B可以全局执行的匿名函数。

//C可以作为变量存储或作为参数传递的代码块。

//D可以在范围内执行的指定代码块。

//4、以下哪一个不是一个接受闭包作为参数的函数?4

//5、5

//A map()返回与原始数组相同长度的新数组。

//B map()是一个对象的集合映射到其他对象的集合

//C、map()对数组中的每个对象执行一个闭包。

funcsumd(numberss:[Int]) ->Int{

    return 5

}

sumd(numberss: [2])

sumd(numberss: [11])

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

推荐阅读更多精彩内容