Как сделать быстрое закрытие быстрым?

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

class Promise {

 func then(onFulfilled: ()->(), onReject: ()->()?){       
    if let callableRjector = onReject {
      // do stuff! 
    }
 }

}

Но Свифт жалуется, что "Связанное значение в условном выражении должно быть необязательным типом", где объявляется "if let".

Ответ 1

Вы должны заключить опциональное закрытие в круглые скобки. Это правильно охватит оператор ?.

func then(onFulfilled: ()->(), onReject: (()->())?){       
    if let callableRjector = onReject {
      // do stuff! 
    }
 }

Ответ 2

Чтобы сделать код еще короче, мы можем использовать nil как значение по умолчанию для параметра onReject и необязательную цепочку ?() при вызове:

func then(onFulfilled: ()->(), onReject: (()->())? = nil) {
  onReject?()
}

Таким образом, мы можем опустить параметр onReject при вызове функции then.

then({ /* on fulfilled */ })

Мы также можем использовать синтаксис закрывающего закрытия для передачи параметра onReject в функцию then:

then({ /* on fulfilled */ }) {
  // ... on reject
}

Вот сообщение в блоге об этом.

Ответ 3

Так как я предполагаю, что это "необязательное" закрытие просто ничего не должно делать, вы можете использовать параметр с пустым закрытием как значение по умолчанию:

func then(onFulfilled: ()->(), onReject: ()->() = {}){       
    // now you can call your closures
    onFulfilled()
    onReject()
}

теперь эту функцию можно вызывать с обратным вызовом onReject <или >

then({ ... })
then({ ... }, onReject: { ... })

Нет необходимости в Swift awesome Optionals? здесь!

Ответ 4

Возможно, это более чистый способ. Особенно, когда у крышки есть сложные параметры.

typealias SimpleCallBack = () -> ()

class Promise {

func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){       
    if let callableRjector = onReject {
        // do stuff! 
    }
}

}