振作起来,因为今天我们将介绍在Swift中许多人难以理解的第一件事。请记住弗里普·威尔逊定律:“如果不在抽奖机上放些钱进去,就不要期望赢得大奖。(you can't expect to hit the jackpot if you don't put a few nickels in the machine.”
最初,您会认为闭包只是简单的匿名函数——我们可以创建并直接将其分配给变量的函数,然后将该变量像字符串或整数一样传递给周围。
但是,闭包通过两种方式使事情复杂化:
- 它们的语法可能会伤害您的大脑,甚至对其语法的解释也会伤害您的大脑。例如,如果一个闭包返回一个整数,并且您编写了一个返回该闭包的函数,那么您可能会读到类似“此函数返回一个返回整数的闭包”的内容。是的,我知道,很难。
- 如果在闭包内使用了创建在闭包外部的变量,那么Swift将确保在闭包的整个生命周期内它们仍然可用,因此您不会意外读取不再存在的内容。
为了使事情更容易理解,我们从相当简单的闭包开始,这似乎似乎毫无意义,但是随着第二天的进行(是的,还有第二天的闭包!),您将开始看到更多基于您今天学习的内容的高级方案。
您需要知道的是: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.
网友评论