Я пытаюсь объявить аргумент в Swift, который требует дополнительного закрытия. Объявленная мною функция выглядит так:
class Promise {
func then(onFulfilled: ()->(), onReject: ()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
Но Swift жалуется, что «связанное значение в условном выражении должно быть необязательным типом», где объявлено «if let».
swift
optional-parameters
Маркоск
источник
источник
Ответы:
Вы должны заключить необязательное закрытие в круглые скобки. Это позволит правильно определить область действия
?
оператора.func then(onFulfilled: ()->(), onReject: (()->())?){ if let callableRjector = onReject { // do stuff! } }
источник
()->Int?
означает.?
самом деле это просто сахарOptional<T>
, поэтому вы также можете написать `func then (onFulfilled: () -> (), onReject: Optional <() -> ()>) {`тогда вам не понадобится лишнее()
, хотя, по-моему,()?
он красивее. Также вы можете сделать его еще красивее с помощью типажей вродеtypealias RejectHandler = () -> ()
func then(onFulfilled: ()->(), onReject: RejectHandler?) {
Чтобы сделать код еще короче, мы можем использовать
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
обратным вызовом или без негоЗдесь нет нужды в крутом Swift
Optionals?
!источник
Может, это более чистый способ. Особенно, когда у укупорки сложные параметры.
typealias SimpleCallBack = () -> () class Promise { func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){ if let callableRjector = onReject { // do stuff! } } }
источник