Понимание синтаксиса закрытия без типа возврата

Я впервые попадаю в 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...
 }
Другие вопросы по тегам