我有两个函数。第一个是将整数作为参数,但不返回任何内容:
func myIntFunction(_ arg: Int) -> Void {
print(arg)
}
第二个是将类型为 (Any) -> Void
的函数作为参数,并且不返回任何内容:
func myAnyFunction(arg: @escaping (Any) -> Void) {
arg(5)
}
所以显然我在这里没有抓住一些东西,因为 Int 是 Any 的子集吗?
因此,如果我尝试使用此代码:
myAnyFunction(arg: myIntFunction)
我收到编译错误:
Cannot convert value of type '(Int) -> Void' to expected argument type '(Any) -> Void'
并建议将我的代码更改为:
myAnyFunction(arg: myIntFunction as! (Any) -> Void)
但是随后我收到运行时错误,因为(Int) -> Void
无法转换为(Any) -> Void
我没有得到什么?我认为使用一个要求 Any
类型的参数的方法/函数,给出一个Integer
作为参数会起作用。
所以有些东西我在这里显然没有抓住,因为
Int
是Any
的一个子集,对吧?
右。然而,由于Int
是Any
的子集,期望Any
的闭包可以传递Int
,但不能反过来(这个强制转换也是不可能的(。
想象一下,有可能将一个闭包Int
投射到一个闭包Any
.现在,用户可以将Int
以外的对象传递给闭包,从而使类型检查变得无关紧要。这就是为什么不允许在这样的闭包类型之间进行转换的原因。
您可以创建另一个调用 myIntFunction
的闭包,如下所示:
myAnyFunction(arg: {a -> Void in myIntFunction(a as! Int)})