답변:
선택적 클로저는 괄호로 묶어야합니다. 이것은 ?
운영자의 범위를 적절하게 지정합니다 .
func then(onFulfilled: ()->(), onReject: (()->())?){
if let callableRjector = onReject {
// do stuff!
}
}
()->Int?
의미 가 혼동 될 수 있습니다.
?
실제로 Optional<T>
는를 위한 설탕 이라는 것을 기억하십시오 . 따라서`func then (onFulfilled : ()-> (), onReject : Optional <() -> ()>) {`그러면 ()
IMO ()?
가 더 예쁘지 만 여분의 . 또한 다음과 같은 typealias로 더 예쁘게 만들 수 있습니다 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
콜백을 사용하거나 사용하지 않고 호출 할 수 있습니다.
then({ ... })
then({ ... }, onReject: { ... })
스위프트의 대단한 필요가 없습니다 Optionals?
!