Ответ 1
Вы должны заключить опциональное закрытие в круглые скобки. Это правильно охватит оператор ?
.
func then(onFulfilled: ()->(), onReject: (()->())?){
if let callableRjector = onReject {
// do stuff!
}
}
Я пытаюсь объявить аргумент в Swift, который принимает необязательное закрытие. Объявленная мной функция выглядит следующим образом:
class Promise {
func then(onFulfilled: ()->(), onReject: ()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
Но Свифт жалуется, что "Связанное значение в условном выражении должно быть необязательным типом", где объявляется "if let".
Вы должны заключить опциональное закрытие в круглые скобки. Это правильно охватит оператор ?
.
func then(onFulfilled: ()->(), onReject: (()->())?){
if let callableRjector = onReject {
// do stuff!
}
}
Чтобы сделать код еще короче, мы можем использовать nil
как значение по умолчанию для параметра onReject
и необязательную цепочку ?()
при вызове:
func then(onFulfilled: ()->(), onReject: (()->())? = nil) {
onReject?()
}
Таким образом, мы можем опустить параметр onReject
при вызове функции then
.
then({ /* on fulfilled */ })
Мы также можем использовать синтаксис закрывающего закрытия для передачи параметра onReject
в функцию then
:
then({ /* on fulfilled */ }) {
// ... on reject
}
Вот сообщение в блоге об этом.
Так как я предполагаю, что это "необязательное" закрытие просто ничего не должно делать, вы можете использовать параметр с пустым закрытием как значение по умолчанию:
func then(onFulfilled: ()->(), onReject: ()->() = {}){
// now you can call your closures
onFulfilled()
onReject()
}
теперь эту функцию можно вызывать с обратным вызовом onReject
<или >
then({ ... })
then({ ... }, onReject: { ... })
Нет необходимости в Swift awesome Optionals?
здесь!
Возможно, это более чистый способ. Особенно, когда у крышки есть сложные параметры.
typealias SimpleCallBack = () -> ()
class Promise {
func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){
if let callableRjector = onReject {
// do stuff!
}
}
}