作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个功能。第一个是将 Integer 作为参数并且不返回任何内容:
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
作为参数就可以了。
最佳答案
So there is something I am not catching here obviously as
Int
is a subset ofAny
right?
没错。但是,由于 Int
是 Any
的子集,因此可以向期望 Any
的闭包传递 Int
,但是反过来不行(这个转换也不可能)。
想象一下,可以将采用 Int
的闭包转换为采用 Any
的闭包。现在,用户可以将 Int
以外的对象传递给您的闭包,从而使类型检查变得无关紧要。这就是为什么不允许在这样的闭包类型之间进行强制转换。
您可以创建另一个调用 myIntFunction
的闭包,如下所示:
myAnyFunction(arg: {a -> Void in myIntFunction(a as! Int)})
关于ios - 无法将类型 '(Int) -> Void' 的值转换为预期的参数类型 '(Any) -> Void',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43882588/
我是一名优秀的程序员,十分优秀!