Понимание синтаксиса закрытия без типа возврата
Я впервые попадаю в swift и наткнулся на заявление о закрытии, которое не имеет для меня большого смысла, исходя из моего текущего понимания того, как пишутся замыкания. Это действительно вопрос из двух частей, потому что я также не совсем понимаю намерение / толкование условной привязки с этим замыканием.
Кусок кода, которым я брошен, таков:
FIRAuth.auth()?.createUser(withEmail: email, password: password) {
(user, error) in if let error = error {
print(error.localizedDescription)
return
}
}
Насколько я понимаю, что замыкание необходимо указать тип возврата на основе определения документа (something1, something2) -> ()
так что из приведенного выше фрагмента кода это означает, что swift может выводить пустое возвращение, не включая -> ()
?
Я предполагаю, что оператор условного связывания просто говорит: "Если аргумент ошибки передан в это замыкание, то вывести ошибку?
Пожалуйста, используйте как можно больше подробностей в своем объяснении, чтобы я мог углубить свое понимание. Ура!
2 ответа
Следующее все эквивалентны
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), тогда пустой тип кортежа (который определяется как Void
) выводится. Однако мы можем явно указать этот тип возврата, либо ()
(тип) или Void
, Из языкового руководства - функции:
Функции без возвращаемых значений
Функции не обязаны определять тип возвращаемого значения....
...
Строго говоря, эта версия
greet(person:)
Функция по-прежнему возвращает значение, даже если возвращаемое значение не определено. Функции без определенного возвращаемого типа возвращают специальное значение типаVoid
, Это просто пустой кортеж, который записывается как()
,
И наоборот, если нет return
дается в конце функционального блока, это будет то же самое, что явно возвращать экземпляр пустого кортежа, а именно ()
(значение). Это также может быть написано просто как return
,
()
это пустой кортеж 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...
}