[swift] 신속하게 선택적 폐쇄를 만드는 방법은 무엇입니까?

선택적 클로저를 취하는 Swift에서 인수를 선언하려고합니다. 내가 선언 한 함수는 다음과 같습니다.

class Promise {

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

}

그러나 Swift는 “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: { ... })

스위프트의 대단한 필요가 없습니다 Optionals?!


답변

아마도 더 깨끗한 방법 일 것입니다. 특히 클로저에 복잡한 매개 변수가있을 때.

typealias SimpleCallBack = () -> ()

class Promise {

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

}


답변