引数型の不定な関数を変数にいれたい
次のように start でコールバック関数を渡して、処理が終わったらコールバック関数を実行したいです。
func callAPI() {
SomeAPI().start(someAPICompleted)
}
func someAPICompleted(api: SomeAPI) {
// SomeAPI終了時の処理
}
上記の SomeAPI のようなクラスを複数作りたいので、共通処理は親クラスの AbstractAPI に書いています。
class AbstractAPI {
var caller: (()->())?
init() {}
func start<T: AbstractAPI>(callBack:(T)->()) {
caller = {[unowned self]()->() in
callBack(self as T)
}
// 処理開始...
}
// 処理完了後に呼ばれる
func completed() {
caller?()
}
}
completed() でコールバックを実行しなければいけないので、start でコールバックをインスタンス変数に入れようと思ったんですが、変数の型をどうすればいいか分からず上記のようにクロージャーで包んで保持しています。
しかしこの書き方は冗長なので、できれば改めたいです。
最初Any型の変数にコールバック関数を保持しようと思ったんですが、Any型の変数を()で実行するとコンパイルエラーになりました。
let f: Any = {println("Hello")}
f()
※f()でコンパイルエラーになる
もう少しスマートなやり方はないでしょうか?