100 Days of SwiftUI —— Day 6:闭包

作者: 韦弦Zhy | 来源:发表于2020-03-08 23:19 被阅读0次

    \color{red}{\Huge \mathtt{100 \ Days \ of \ SwiftUI \ — \ Day \ 6}}

    \color{orange}{\Large \mathbf{闭包 (上)}}

    \underline{\color{orange}{\large \mathbf{Closures, \ Part \ One}}}

    振作起来,因为今天我们将介绍在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 closurestest

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

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

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

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

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

    driving()
    

    2. 在闭包中接受参数 Accepting parameters in a closuretest

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

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

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

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

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

    driving("London")
    

    3. 从闭包中返回值 Returning values from a closuretest

    闭包也可以返回值,它们的写法与参数类似:您可以将它们写在闭包中,紧接在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 parameterstest

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

    首先,这是我们的基本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 syntaxtest

    如果函数的最后一个参数是闭包,则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 5:函数

    ╮( ̄▽ ̄)╭

    \color{orange}{\Huge \Bbb{Back \ \ to \ 100 \ \ Days \ \ of \ \ SwiftUI}}

    相关文章

      网友评论

        本文标题:100 Days of SwiftUI —— Day 6:闭包

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