Передача необязательного обратного вызова в функцию Swift

Я изучаю Swift lang, но я не могу передать необязательный аргумент обратного вызова в функцию:

func dismiss(completion: () -> Void) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}

Это показывает мне ошибку - Type () -> Void does not conform to protocol 'LogicValue'

Любые предложения?

Ответ 1

Обновление для Swift 3/4:

Необязательный параметр больше не является булевым выражением, а устаревший func dismissModalViewControllerAnimated(animated: Bool) больше не доступно в Swift.

Просто объявите параметр завершения как необязательное закрытие и передать его на

func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)

который также принимает необязательное замыкание:

func dismiss(completion: (() -> Void)? = nil) {
    self.dismiss(animated: true, completion: completion)
}

Старый (Swift 1.x?) ответ:

Объявить параметр completion как (неявно развернутый) необязательный закрытие (() -> Void)!:

func dismiss(completion: (() -> Void)!) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}

Но заметьте, что вы можете позвонить

self.dismissViewControllerAnimated(true, completion: completion)

в любом случае, поскольку параметр completion этой функции также является необязательным. И

func dismissModalViewControllerAnimated(animated: Bool)

на самом деле отмечен как устаревший.

Ответ 2

Просто добавив к ответу Martin R выше..

Обратный вызов может быть необязательным, вместо неявного параметра (с восклицательным знаком) используйте необязательный оператор.

func dismiss(completion: (() -> Void)?) {
    if completion != nil {
        return self.dismissViewControllerAnimated(true, completion: completion!)
    }

    self.dismissModalViewControllerAnimated(true)
}

Ответ 3

Лучше добавить = nil в объявление обратного вызова, чтобы избежать передачи nil при вызове:

func dismiss(completion: (() -> Void)? = nil) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true) }

И вы можете вызвать свою функцию следующим образом: dismiss()