Swiftで呼び出し可能なブロック/関数があるかどうかを確認する簡単で明確な方法はありますか?いくつかの言語ではそれはささいなことですが、おそらく私はこれをSwiftの間違った視点から見ていますか?以下を考慮する。変数がSwiftでブロック/関数/呼び出し可能であることを確認してください
func foo(){ print("foo") }
var bar:() ->() = { print("bar") }
var baz:() -> (Bool) = { print("baz"); return true }
print(foo) // (Function)
print(bar) // (Function)
print(baz) // (Function)
print(foo is() ->()) // true
print(bar is() ->()) // true
print(baz is() ->()) // false
print(baz is() -> (Bool)) // true
スウィフトは、そのようなデータタイプはありませんが、すべて機能していることがわかります。私は確固たる署名を使って確認できますが、署名*が気にせず、単にそれを呼び出すような状況があるかもしれません。たとえば:
func call(callable:() ->()) {
callable()
}
call(foo) // foo
call(bar) // bar
call(baz) // error: cannot convert value of type '() -> (Bool)' to expected argument type '() ->()'
私はVoid
とBool
戻り値の型のために働くであろう、このようにそれを書き換えるが、すべてのタイプのためにこれをやってはクレイジーです、私はそれを気にしない、特に以来、コンパイラはありませんすることができます... *
func call(callable: Any) {
if let block:() ->() = callable as?() ->() {
block()
} else if let block:() -> (Bool) = callable as?() -> (Bool) {
block()
}
}
call(foo) // foo
call(bar) // bar
call(baz) // truely baz
はない署名を気にすることは罪である、同意します。議論のために、戻り値の型を気にしないでください。
私は変数が呼び出し可能だった場合は、知っているしなければならないだけで、それはパラメータを期待している場合ことを、考慮すべき問題は次のようになりますね。呼び出し可能なものがあるかどうかを知ることは、そのパラメータがわからなければ価値がありません。 –
真、したがって脚注。 –
しかし、私は戻り値の型について話しているわけではありません。私はパラメータについて話しています。 –