Есть ли простой и определенный способ в 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
Swift знает, что все они являются функциями, хотя таких типов данных нет. Я могу проверить, используя прочную подпись, но может быть ситуация, когда мне не нужна подпись * и просто хочу ее вызвать. Например:
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
* Согласитесь, не заботясь о подписи является грехом. Для аргументации давайте просто не заботимся о возвращаемом типе.
Я думаю, проблема рассмотреть бы, что вы не только должны знать, если переменная была отозваны, но если он ожидает, что параметры. Знание того, что что-то вызываемое, не имеет значения, если вы не знаете его параметров. –
Правда, следовательно, сноска. –
Но я не говорю о типе возврата. Я говорю о параметрах. –