最近コールバックで少し難解なコードに遭遇したのでそのことを書いてみます。
遭遇したのは下のようなコードです。
execを呼び出すと計算されて、その結果をexecutedに渡すというもの。
class Calculator { var executed: (Int -> Void)? func exec() { // 計算処理 executed?(1) } } let c = Calculator() c.executed = { result in // 計算後の処理 } c.exec()
上だと良いんですが、コールバックと実際の処理の間に色々な処理が入ると結構追いかけるのが大変です。
let c = Calculator() c.executed = { result in // 計算後の処理 } // 間に色々処理が入る c.exec()
あと、処理を追加した時もどんどんコールバックが増えて大変になります。
class Calculator { var added: (Int -> Void)? var multiplied: (Int -> Void)? func add() { // 計算処理 added?(1) } func multiply() { // 計算処理 multiplied?(1) } }
そういった事もあるので、今回のケースではコールバックは使わずに普通にResultを返す方が良さそうだと思いました。
これなら実行後処理と実行の間が空きにくいしコールバックが増えていく問題もなさそうです。
class Calculator { func exec() -> Int { // 計算処理 return 1 } } let c = Calculator() let result = c.exec() // 計算後の処理
逆にコールバックが必要な時を考えてみます。
コールバックは通信処理やユーザーのアクションに対するイベントなどで良く使われています。
こういった非同期的に処理が呼ばれるケースでは有効そうです。