理解没有返回类型

时间:2016-12-31 22:10:13

标签: swift closures conditional-binding

我第一次在这里进入swift,我偶然发现了一个封闭语句,根据我目前对闭包写法的理解,这对我来说并没有多大意义。这实际上是一个由两部分组成的问题,因为我也没有完全理解这个闭包的条件绑定背后的意图/解释。

我抛出的代码块是:

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

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

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

请尽可能详细地说明您的解释,以便我进一步了解。干杯!

2 个答案:

答案 0 :(得分:4)

以下都是等效的

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))  // (()) -> ()
// ...

如果没有为函数(/ closure)提供返回 type ,则推断出空元组 type (由Void进行类型化)。但是,我们可以明确地提供此返回类型,作为()类型)或Void。来自the language guide - functions

  

没有返回值的函数

     

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

     

...

     

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

相反,如果在功能块的末尾没有给出return,它将与显式返回空元组的实例相同,即())。这也可以简单地写成return

答案 1 :(得分:1)

()是空元组。 Swift中的Void只是()的类型别名。如果函数或闭包没有指定返回类型,则假定()

为避免混淆,(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...
 }