我有两个功能。第一个是将Integer作为参数并且不返回任何内容:
router.get('/songs/:idortitle', function(req,res,next) {
const permalink = req.params.idortitle;
const songQuery !isNaN(permalink) && !req.session.user.role ==='user' ? queries.getSong('id',permalink) :queries.getSong('title',permalink);
songQuery.then(result => {
res.render('app', {song, title: 'song', page: 'song'});
}).catch(e => {
console.error(err);
return res.status(500).json({error: err});
});
});
第二个是将func myIntFunction(_ arg: Int) -> Void {
print(arg)
}
类型的函数作为参数并且不返回任何内容:
(Any) -> Void
所以有一些我不明白的地方,因为Int是Any的子集吗?
因此,如果我尝试使用此代码:
func myAnyFunction(arg: @escaping (Any) -> Void) {
arg(5)
}
我收到编译错误:
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
作为参数可行。
答案 0 :(得分:3)
因为
Int
是Any
的一个子集,所以我在这里找不到一些东西吗?
右。但是,由于Int
是Any
的子集,因此期望Any
的闭包可以传递Int
,但不能相反(此投射不可能) )。
想象一下,有可能将Int
转换为关闭Any
。现在,用户可以将Int
以外的对象传递给闭包,渲染类型检查无关紧要。这就是为什么不允许在这样的闭包类型中进行投射。
您可以创建另一个调用myIntFunction
的闭包,如下所示:
myAnyFunction(arg: {a -> Void in myIntFunction(a as! Int)})