SwiftUI-Day6-7 闭包

文章目录

  • 吐槽
  • 结果
  • 简单的闭包
  • 带参数的闭包
  • 有返回值的闭包
  • 闭包作为参数
  • 尾随闭包
  • 尾随闭包并带参数
  • 尾随闭包并带返回值
  • 闭包简写
  • 多参数闭包
  • 函数返回一个闭包
  • 闭包捕获

吐槽

Xcode升级,什么appdelegate都没有了,现在全是swiftUI。。。
下面的代码是playground的代码,不是swiftUI View。
参考资料:
https://www.hackingwithswift.com/100/swiftui/6
https://www.hackingwithswift.com/100/swiftui/7
时间:10 October, 2020

结果

运行快捷键:shift+command+回车
删除当前行:option+D

简单的闭包

let driving = {
    print("I'm driving in my car")
}
driving()

带参数的闭包

let driving = { (place: String) in
    print("I'm going to \(place) in my car")
}
driving("London")

有返回值的闭包

let drivingWithReturn = { (place: String) -> String in
    return "I'm going to \(place) in my car"
}
let message = drivingWithReturn("London")
print(message)

闭包作为参数

let driving = {
    print("I'm driving in my car")
}
func travel(action: () -> Void) {
    print("I'm getting ready to go.")
    action()
    print("I arrived!")
}
travel(action: driving)

尾随闭包

不用再定义闭包参数了

func travel(action: () -> Void) {
    print("I'm getting ready to go.")
    action()
    print("I arrived!")
}
travel() {
    print("I'm driving in my car")
}

//可以简写成
travel {
    print("I'm driving in my car")
}

尾随闭包并带参数

func travel(action: (String) -> Void) {
    print("I'm getting ready to go.")
    action("London")
    print("I arrived!")
}
travel { (place: String) in
    print("I'm going to \(place) in my car")
}

尾随闭包并带返回值

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"
}

闭包简写

原始

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"
}

去掉输入参数类型

travel { place -> String in
    return "I'm going to \(place) in my car"
}

去掉返回值类型

travel { place in
    return "I'm going to \(place) in my car"
}

闭包只有一行代码,可以去掉return关键字

travel { place in
    "I'm going to \(place) in my car"
}

可以用下标表示第几个传入参数,从而代替关键字

travel {
    "I'm going to \($0) in my car"
}

写成这样,谁知道这是在干啥。。

多参数闭包

func travel(action: (String, Int) -> String) {
    print("I'm getting ready to go.")
    let description = action("London", 60)
    print(description)
    print("I arrived!")
}
travel {
    "I'm going to \($0) at \($1) miles per hour."
}

函数返回一个闭包

func travel() -> (String) -> Void {
    return {
        print("I'm going to \($0)")
    }
}
let result = travel()
result("London")
//不建议
let result2 = travel()("London")

闭包捕获

虽然变量counter在函数内部,但是这个变量用在了闭包中, 这个时候就会发生闭包捕获的情况,也就是保持变量状态。

func travel() -> (String) -> Void {
    var counter = 1
    return {
        print("\(counter). I'm going to \($0)")
        counter += 1
    }
}
let result = travel()
result("London")

result("London")
result("London")
result("London")

你可能感兴趣的:(swift)