私は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: { ... })
Swiftの素晴らしいOptionals?
ここに!
たぶん、もっときれいな方法でしょう。特に、クロージャーに複雑なパラメーターがある場合。
typealias SimpleCallBack = () -> ()
class Promise {
func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){
if let callableRjector = onReject {
// do stuff!
}
}
}