どのようにすれば迅速にオプションのクロージャーを作成できますか?


93

オプションのクロージャーを受け取るSwiftで引数を宣言しようとしています。私が宣言した関数は次のようになります。

class Promise {

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

}

しかし、Swiftは、「条件付きのバインド値は、「if let」が宣言されているOptionalタイプでなければならない」と不平を言っています。


パラメータを持つクロージャを1つだけ使用することを検討してください。
カタノア

回答:


113

オプションのクロージャーを括弧で囲む必要があります。これにより、?オペレーターのスコープが適切になります。

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

理由を括弧で囲まなければならない理由を知っていますか?
Marcosc 2014年

5
おそらくあいまいさを取り除くためです。オプションのクロージャーに戻り値がある場合、それが何を()->Int?意味するかについて混乱する可能性があります。
セザール2014年

3
また、Swiftの本から:「オプションの型を宣言するときは、括弧を使用して、?オペレーター。例として、整数のオプションの配列を宣言するには、型注釈を(Int [])?;と記述します。Int []を書き込んでいますか?エラーが発生します。」
Cezar

@Cezar「オプションのクロージャー」を使用する理由と場所について少し説明していただけますか。
iLearner

@Cezar現時点ではMacにないため、構文が少しずれるかもしれませんが、これ?はの単なる砂糖でOptional<T>あることを覚えておいてください。したがって、 `func then(onFulfilled:()->()、onReject:Optional <() ->()>){` ()IMOの方()?がきれいですが、追加は必要ありません。また、次のようなタイプエイリアスでさらにきれいにすることもできます typealias RejectHandler = () -> () func then(onFulfilled: ()->(), onReject: RejectHandler?) {
Andrew Carter

62

コードをさらに短くするために、パラメーターのnilデフォルト値onRejectおよび?()呼び出し時にオプションのチェーンとして使用できます。

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

これにより、関数onRejectを呼び出すときにパラメーターを省略できますthen

then({ /* on fulfilled */ })

後続のクロージャー構文を使用して、onRejectパラメーターをthen関数に渡すこともできます。

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

ここにあるブログの記事それについては。


34

私は、この「オプション」のクロージャーは何もしないと想定しているので、デフォルト値として空のクロージャーを持つパラメーターを使用できます。

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

この関数はonRejectコールバックの有無にかかわらず呼び出すことができます

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

Optionals?ここではSwiftのすばらしい機能は必要ありません。


これは素晴らしい解決策です!
Roland T.

6

多分それはよりきれいな方法です。特にクロージャに複雑なパラメータがある場合。

typealias SimpleCallBack = () -> ()

class Promise {

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

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.