web-dev-qa-db-ja.com

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

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

class Promise {

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

}

ただし、Swiftは、「if let」が宣言されている「条件のバインド値はオプションの型でなければならない」と文句を言います。

87
Marcosc

オプションのクロージャーを括弧で囲む必要があります。これにより、?演算子。

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

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

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

このようにして、onReject関数を呼び出すときにthenパラメーターを省略できます。

then({ /* on fulfilled */ })

onRejectパラメーターをthen関数に渡すために、末尾のクロージャー構文を使用することもできます。

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

これが ブログ投稿 です。

53
Evgenii

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

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

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

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

Swiftの素晴らしいOptionals? ここに!

32
DiegoFrings

たぶん、もっときれいな方法でしょう。特に、クロージャーに複雑なパラメーターがある場合。

typealias SimpleCallBack = () -> ()

class Promise {

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

}
3
Seifolahi