美文网首页
闭包、尾随闭包、及其速记语法

闭包、尾随闭包、及其速记语法

作者: 三分只一草履虫 | 来源:发表于2020-09-10 20:45 被阅读0次

时间2020.9.10 环境 Mac10.15.6 Xcode11.6 (11E708)

1 闭包Closur

1-1.闭包作用

1.延迟后运行一些代码

2.动画结束后运行一些代码

3.下载完成后运行一些代码

4.当用户从菜单中选择一个可选项后运行一些代码

闭包能将一些功能封装在一个变量(var)中,然后将其存储在某个地方。

我们还可以从函数func中返回一个闭包,然后把它存在其他地方。

Swift让我们能够像使用String 和 Int 这些数据类型一样来使用function,比如将function指派给一个变量,甚至将它作为一个参数parameter,传递给另一个函数function。这种使用方法叫做闭包.(me:闭包相当于函数性质的数据类型)

1-2 闭包的创建和使用

环境 Mac10.15.6 Xcode11.6 (11E708)

@1、无参数,无返回值的闭包_____本质相当于 () -> Void 的形式

let driving = { 
  print("I am driving my car")
}

调用
driving()

========
@2、带参数,无返回值的闭包
let driving = { (place: String) in 
               print("I am driving to \(place) in my car")
}

调用
driving("London")

========
@3、带参数,有返回值的闭包
let drivingWithReturn = { (place: String) -> String in 
                        return "I am going to \(place) in my car"
}

调用
let message = drivingWithReturn("London")  //
print(message)

========
@4、无参数,有返回值的闭包
let payment = { () -> Bool in
              print("Paying an anonymous person...")
              return true
}

调用
let end = payment()
print(end)

=======
@5、@@无参数,无返回值闭包充当函数function的参数,即函数的参数类型为 闭包()-> Void
let driving = {
    print("AAAA")
}

func travel(action: () -> Void) { //参数类型是 闭包类型 ()-> Void
    print("BBBB")
    print("CCCC")
    action()        //@@函数主图中的运行action()就相当于下文直接调用的driving()这个闭包, 相当于函数内使用了 @1 的用法
}

调用
driving()   //调用闭包,输出 AAAA,调用同@1
travel(action: driving) //调用函数,传入闭包参数,输出BBBB CCCC AAAA 


尾随闭包语法
### 尾随闭包语法 Trailing closure syntax
如果函数function的最后一个参数是闭包,那么在调用该函数function时,与其将闭包作为参数传递,不如在大括号内的函数之后直接传递它。

=======
@6,尾随闭包语法1,函数只有一个参数,且该参数为无参数.无返回值闭包(即,函数最后一个参数为闭包)
func travel(action: () -> Void) {
    print("BBB")
    print("CCC")
    action() //关键
}

调用一
travel() {
    print("AAA")  //调用函数,直接将闭包传递,而不是把闭包当成参数后,以传统的函数方法使用,输出BBB CCC AAA
}
调用二 但闭包无参数时简化,尾随闭包语法可去掉(),进一步简化如下
trave{
    print("AAA") //输出 BBB CCC AAA
}
//与@5对比,使用尾随闭包语法后,调用travel(XXX)函数时,就不要再传入一个闭包参数,而是变成直接闭包传入,使得同样想输出BBB CCC AAA,就少写了 let driving = { print("AAAA") } 闭包作为常量的定义表达


========
@7,尾随闭包语法举例2,函数有多个参数,最后一个参数为无参数.无返回值闭包
func animate(duration: Double, animations: () -> Void) {
    print("Starting a \(duration) second animation…")
    animations() //关键
}

调用一,未简化
animate(duration: 3, animations: { //调用函数,使用尾随闭包语法函数调用时直接传递闭包内容
    print("Fade out the image")
})

调用二,简化,可删除尾随闭包的参数标签
animate(duration: 3) {  //调用函数,
    print("Fade out the image")
}

=======
@8,尾随闭包举例3,函数带单个参数,且最后一个参数为带参数,无返回值闭包
func travel(action: (String) -> Void) {
    print("I'm getting ready to go.")
    action("London")  //闭包的直接调用,本质是@2
    print("I arrived!")
}

调用,未简化
travel { (place: String) in   //调用函数,尾随闭包调用方式,将带参数,无返回值闭包直接传入函数
    print("I'm going to \(place) in my car")
}

@9,尾随闭包举例4,函数带单个参数,最后一个参数为带参数,有返回值的闭包
func travel(action: (String) -> String) {
    print("I'm getting ready to go.")
    let description = action("London") //闭包调用,本质同@3
    print(description)
    print("I arrived!")
}

调用,未简化
travel { (place: String) -> String in //调用函数,尾随闭包调用方式,
    return "I'm going to \(place) in my car"
}

========
Swift的速记语法shorthand syntax和尾随闭包语法的结合

@10,尾随闭包的速记语法变形
尾随闭包举例5,函数带单个参数,最后一个参数为带参数,有返回值的闭包
func travel(action: (String) -> String) {
    print("I'm getting ready to go.")
    let description = action("London") //闭包调用
    print(description)
    print("I arrived!")
}

调用一,原始尾随闭包调用方式
travel { (place: String) -> String in   //完整闭包
    return "I'm going to \(place) in my car"
}

调用二,速记语法简化2
travel { place -> String in //简化闭包内参数类型
    return "I'm going to \(place) in my car"
}
调用三,速记语法简化2
travel { place in  //简化闭包参数类似,返回值类型
    return "I'm going to \(place) in my car"
}
调用四,
travel { place in //简化闭包参数类型,返回值类型,return关键字
    "I'm going to \(place) in my car"
}

调用五,
travel {    //简化闭包参数,返回值类型,in, return关键字,且闭包参数用 $0 代替
    "I'm going to \($0) in my car"
}字符串

======
@11,尾随闭包举例6,函数带n个参数,最后一个参数为带参数,有返回值的闭包
func travel(action: (String, Int) -> String) {
    print("I'm getting ready to go.")
    let description = action("London", 60)
    print(description)
    print("I arrived!")
}

调用
travel {  //函数调用,尾随闭包速记语法形式,$0,$1可知闭包有2个参数,无print(),知道带返回值,且为返回字符串
    "I'm going to \($0) at \($1) miles per hour."
}

=======
闭包作为函数function的返回值    (从函数中返回闭包)
@12,一个不带参数的函数,返回值类型是闭包
func travel() -> (String) -> Void {
    return {
        print("I'm going to \($0)") //用了尾随闭包速记语法,$0知,原始闭包带一个参数,由print()知,闭包无返回值
    }
}

调用
let result = travel() //travel()函数返回的是带单参数无返回值的闭包,故result数据类型为闭包
result("London")  //闭包的直接调用方式,同@2

=====
如果在闭包中使用外部值,则会捕获它们,以便闭包可以稍后引用它们
@13,从函数返回闭包的一个作用,用于在返回的闭包内捕捉特定可改变值
func travel() -> (String) -> Void {
    var counter = 1
    return {
        print("\(counter). I'm going to \($0)")
        counter += 1
    }
}
调用,连续调用3次,问输出的内容
let result = travel()
result("London") //输出 1. I'm going to London
result("London") //       2. I'm going to London
result("London") //       3. I'm going to London
/





***************************************************************************
@6,暂时封存,不考虑@@有参数,无返回值闭包充当函数function的参数,即参数类型为
let driving = { (place: String) in
    print("start \(place) end")
}

func travel(action: (String) -> Void) {
    print("AAA")
    print("BBB")
    action("222")  //相当于运行了 driving("22"),同@2
}
调用
dirving("111") //输出 start 111 end
travel(action: driving) //输出 AAA BBB start 222 end




参考

https://www.hackingwithswift.com/100/swiftui/6

相关文章

  • 闭包、尾随闭包、及其速记语法

    时间2020.9.10 环境 Mac10.15.6 Xcode11.6 (11E708) 1 闭包C...

  • 闭包-Closures [swift 5.1]

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

  • Swift Tour Learn (五) -- Swift 语法

    本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...

  • swift-闭包

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

  • swift- 闭包一

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

  • 第三周第二天

    第三周第二天 函数作为参数,匿名函数(闭包)尾随闭包 闭包,尾随闭包 数组的过滤,缩减,映射

  • Day7 闭包(Closures)

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

  • iOS中Swift从开始入门到最后的放弃(十2),

    #闭包(Closures) 本页包含内容: - 闭包表达式(Closure Expressions) - 尾随闭包...

  • 闭包 Closure

    内容摘要: 闭包介绍 闭包表达式 尾随闭包 值捕获 逃逸闭包 自动闭包 一、闭包介绍 闭包是自包含的函数代码块,可...

  • Swift5.0 闭包

    本文目录: 闭包 尾随闭包 逃逸闭包 自动闭包 循环引用 闭包 全局函数:有名字,不捕获任何值; 嵌套函数:有名字...

网友评论

      本文标题:闭包、尾随闭包、及其速记语法

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