4

我在这里第一次接触到 swift,我偶然发现了一个闭包语句,根据我目前对闭包如何编写的理解,这对我来说没有多大意义。这实际上是一个由两部分组成的问题,因为我也不太了解此闭包的条件绑定背后的意图/解释。

我抛出的代码块是这样的:

 FIRAuth.auth()?.createUser(withEmail: email, password: password) {
    (user, error) in if let error = error {
        print(error.localizedDescription)
        return
    }
}

我的理解是闭包需要根据文档定义指定一个返回类型,(something1, something2) -> ()所以从上面的代码中,这是否意味着 swift 可以通过不包括-> ()?

我的假设是条件绑定语句只是说'如果错误 arg 被传递到这个闭包中,那么打印错误?

请在您的解释中使用尽可能多的细节,以便我进一步理解。干杯!

4

2 回答 2

5

以下都是等价的

func foo1() -> () { }
func foo2() -> () { return () }
func foo3() -> () { return Void() }
func foo4() -> () { return }

func foo5() -> Void { }
func foo6() -> Void { return () }
func foo7() -> Void { return Void() }
func foo8() -> Void { return }

func foo9() { }
func foo10() { return () }
func foo11() { return Void() }
func foo12() { return }

print(type(of: foo1))  // (()) -> ()
// ...
print(type(of: foo5))  // (()) -> ()
// ...
print(type(of: foo9))  // (()) -> ()
// ...

如果没有为函数(/闭包)提供返回类型,则推断空元组类型(由 类型别名Void)。然而,我们可以明确地提供这个返回类型,或者作为()类型),或者Void。从语言指南 - 功能

没有返回值的函数

函数不需要定义返回类型。...

...

严格来说,这个版本的greet(person:)函数仍然返回一个值,即使没有定义返回值。没有定义返回类型的Void函数返回 type 的特殊值。这只是一个空元组,写为().

相反,如果return在函数块的末尾给出 no ,它将与显式返回空元组的实例相同,即()( value )。这也可以简单地写为return

于 2016-12-31T22:35:29.777 回答
1

()是空元组。Void在 Swift 中只是(). 如果函数或闭包未指定返回类型,则()假定为。

为避免混淆,(user, error) in应该单独一行:

 FIRAuth.auth()?.createUser(withEmail: email, password: password) { user, error in
    if let error = error {
        print(error.localizedDescription)
        return
    }
 }

我建议使用guard声明来强制提前返回:

 FIRAuth.auth()?.createUser(withEmail: email, password: password) { user, error in
    guard error == nil else {
        print(error!.localizedDescription)
        return
    }

     // There's no error, carry on...
 }
于 2016-12-31T22:35:24.683 回答