100 Days of SwiftUI —— Day 6:闭包 (上)

100 Days of SwiftUI —— Day 6:闭包 (上)_第1张图片

振作起来,因为今天我们将介绍在Swift中许多人难以理解的第一件事。请记住弗里普·威尔逊定律:“如果不在抽奖机上放些钱进去,就不要期望赢得大奖。(you can't expect to hit the jackpot if you don't put a few nickels in the machine.”

最初,您会认为闭包只是简单的匿名函数——我们可以创建并直接将其分配给变量的函数,然后将该变量像字符串或整数一样传递给周围。

但是,闭包通过两种方式使事情复杂化:

  • 它们的语法可能会伤害您的大脑,甚至对其语法的解释也会伤害您的大脑。例如,如果一个闭包返回一个整数,并且您编写了一个返回该闭包的函数,那么您可能会读到类似“此函数返回一个返回整数的闭包”的内容。是的,我知道,很难。
  • 如果在闭包内使用了创建在闭包外部的变量,那么Swift将确保在闭包的整个生命周期内它们仍然可用,因此您不会意外读取不再存在的内容。
100 Days of SwiftUI —— Day 6:闭包 (上)_第2张图片
Closure

为了使事情更容易理解,我们从相当简单的闭包开始,这似乎似乎毫无意义,但是随着第二天的进行(是的,还有第二天的闭包!),您将开始看到更多基于您今天学习的内容的高级方案。

您需要知道的是:SwiftUI使用闭包的地方很多,所以这是您需要了解的东西。

今天,您只有五个一分钟的视频可供观看,以确保您有足够的时间观看两次视频(如果需要的话)完成每个视频后,将进行简短测试,以确保您了解了所教的内容。

1. 创建基础闭包 Creating basic closures – test

Swift使我们可以像使用其他类型一样使用函数,例如字符串和整数。这意味着您可以创建一个函数并将其分配给一个变量,使用该变量调用该函数,甚至将该函数作为参数传递给其他函数。

以这种方式使用的函数称为闭包closures,尽管它们像函数一样工作,但编写方式有所不同。

让我们从一个简单的示例开始,该示例显示一条消息:

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

这样可以有效地创建一个没有名称的函数,并将该函数分配给driving。现在,您可以像调用常规函数一样调用Driving(),如下所示:

driving()

2. 在闭包中接受参数 Accepting parameters in a closure – test

创建闭包时,它们没有名称或空格来写入任何参数。这并不意味着他们不能接受参数,只是他们以不同的方式接受参数:它们在大括号内列出。

要使闭包接受参数,请在开括号后面的括号内列出它们,然后输入关键字in,以便Swift知道闭包的主体正在开始。

例如,我们可以制作一个接受地名字符串作为其唯一参数的闭包,如下所示:

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

函数和闭包之间的区别之一是,运行闭包时不使用参数标签。因此,现在我们这样调用Driving()

driving("London")

3. 从闭包中返回值 Returning values from a closure – test

闭包也可以返回值,它们的写法与参数类似:您可以将它们写在闭包中,紧接在in关键字之前。

为了说明这一点,我们将使用Driving()闭包,使其返回其值,而不是直接打印它。

我们希望闭包返回一个字符串,而不是直接打印消息,因此我们需要在in之前使用-> String,然后像正常函数一样使用return

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

现在,我们可以运行该闭包并打印其返回值:

let message = drivingWithReturn("London")
print(message)

4. 将闭包作为参数 Closures as parameters – test

因为闭包可以像字符串和整数一样使用,所以可以将它们传递给函数。语法起初可能会伤及您的大脑,因此我们将慢慢来。

首先,这是我们的基本Driving():

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

如果我们想将该闭包传递到函数中以便可以在该函数中运行,则可以将参数类型指定为()-> Void。这意味着“不接受任何参数,并返回Void” –——Swift中的“不做任何事”的表达方式。

因此,我们可以编写一个travel()函数来接受不同种类的旅行动作,并在此之前和之后打印一条消息:

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

现在,我们可以他来调用我们的driving闭包,如下所示:

travel(action: driving)

5. 尾随闭包语法 Trailing closure syntax – test

如果函数的最后一个参数是闭包,则Swift可让您使用称为尾随闭包的特殊语法。与其在闭包中作为参数传递,不如在括号内的函数之后直接传递它。

为了证明这一点,这里再次是我们的travel()函数。它接受action 闭包,以便可以在两个print()调用之间运行:

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

因为它的最后一个参数是闭包,所以我们可以使用尾随闭包语法来调用travel(),如下所示:

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

实际上,由于没有其他参数,我们可以完全消除括号:

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

尾随闭包语法在Swift中非常常见,因此值得去变得习惯他。

有时人们会问我:“为什么你在开始某些话题要说些很难,那不是把人们吓走吗?”

显然,我的目标不是让你离开Swift。相反,我的希望是,当您为某些事情而苦苦挣扎时,从未想过自己:“我不适合Swift。”如果您发现闭包很难,那不是因为您不够聪明而是他们很难,所以这只是您的大脑工作正常的一个信号。

别失望。有时候努力学习可以使它更好地扎在你的脑海里——没有奋斗就没有学习!

You can do this.

赏我一个赞吧~~~

你可能感兴趣的:(100 Days of SwiftUI —— Day 6:闭包 (上))