我第一次在这里进入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被传递到这个闭包中,那么打印错误?
请尽可能详细地说明您的解释,以便我进一步了解。干杯!
答案 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...
}