Có cách nào đơn giản và xác định trong Swift để kiểm tra xem có gì đó là khối/chức năng có thể gọi không? Trong một số ngôn ngữ, đó là một điều tầm thường, nhưng có lẽ tôi đang xem xét điều này từ một quan điểm sai lầm trong Swift? Hãy xem xét những điều sau đây.Kiểm tra xem biến có phải là một khối/chức năng/có thể gọi trong 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 biết rằng tất cả đều có chức năng, mặc dù không có loại dữ liệu như vậy. Tôi có thể kiểm tra bằng cách sử dụng một chữ ký vững chắc, nhưng có thể có một tình huống mà tôi không quan tâm đến chữ ký * và chỉ đơn giản là muốn gọi nó. Ví dụ:
func call(callable:() ->()) {
callable()
}
call(foo) // foo
call(bar) // bar
call(baz) // error: cannot convert value of type '() -> (Bool)' to expected argument type '() ->()'
tôi có thể viết lại nó như thế này, mà sẽ làm việc cho Void
và Bool
kiểu trả về, nhưng làm điều này cho tất cả các loại là điên rồ, đặc biệt là kể từ khi tôi không quan tâm về điều đó, nhưng trình biên dịch hiện ...
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
* Đồng ý, không quan tâm đến chữ ký là tội lỗi. Đối với các đối số vì lợi ích, chúng ta chỉ cần không quan tâm về kiểu trả về.
Tôi đoán một vấn đề cần xem xét sẽ là, bạn sẽ không chỉ phải biết, nếu biến là callable, nhưng nếu họ hy vọng các thông số. Biết nếu một cái gì đó có thể gọi được là không có giá trị nếu bạn không biết đó là thông số. –
Đúng, do đó chú thích cuối trang. –
Nhưng tôi không nói về kiểu trả về. Tôi đang nói về các thông số. –