无法将 '(Int) -> Void' 类型的值转换为预期的参数类型 '(Any) -> Void'

  • 本文关键字:Void 类型 Any 参数 Int 转换 ios swift
  • 更新时间 :
  • 英文 :


我有两个函数。第一个是将整数作为参数,但不返回任何内容:

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作为参数会起作用。

所以有些东西我在这里显然没有抓住,因为IntAny的一个子集,对吧?

右。然而,由于IntAny的子集,期望Any的闭包可以传递Int,但不能反过来(这个强制转换也是不可能的(。

想象一下,有可能将一个闭包Int投射到一个闭包Any.现在,用户可以将Int以外的对象传递给闭包,从而使类型检查变得无关紧要。这就是为什么不允许在这样的闭包类型之间进行转换的原因。

您可以创建另一个调用 myIntFunction 的闭包,如下所示:

myAnyFunction(arg: {a -> Void in myIntFunction(a as! Int)})

相关内容

最新更新