百日学 Swift(Day 6)– 闭包:第 1 部分

百日学 Swift(Day 6) – closures part one(闭包:第 1 部分)

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

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

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

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

let driving = {
    print("我在开车")
}

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

driving()

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

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

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

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

let driving = { (place: String) in
    print("我要开车去\(place)")
}

函数和闭包之间的区别之一是,在运行闭包时不使用参数标签。

driving("杭州")

3. Returning values from a closure(从闭包返回值)test

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

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

let driving = { (place: String) in
    print("我要开车去\(place)")
}

我们希望闭包返回一个字符串而不是直接打印消息,因此我们需要使用-> Stringbefore in,然后return像普通函数一样使用:

let drivingWithReturn = { (place: String) -> String in
    return "我要开车去\(place)"
}

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

let message = drivingWithReturn("杭州")
print(message)

4. Closures as parameters(闭包作为参数)test

因为闭包可以像字符串和整数一样使用,所以可以将它们传递给函数。

首先,这是我们的基本闭包driving()

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

如果我们想将该闭包传递给函数,以便可以在该函数内部运行,则可以将参数类型指定为() -> Void。这意味着“不接受任何参数,然后返回Void

因此,我们可以编写一个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("准备出发")
    action()
    print("已到达目的地,本次导航结束")
}

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

travel() {
    print("高德导航持续为您服务")
}

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

travel {
    print("高德导航持续为您服务")
}

尾随闭包语法在Swift中非常普遍。

发布了53 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/hh680821/article/details/105172554