无法转换类型'(Int) - >的值Void'到预期的参数类型'(任意) - >虚空”

时间:2017-05-10 02:18:32

标签: ios swift

我有两个功能。第一个是将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作为参数可行。

1 个答案:

答案 0 :(得分:3)

  

因为IntAny的一个子集,所以我在这里找不到一些东西吗?

右。但是,由于IntAny的子集,因此期望Any的闭包可以传递Int,但不能相反(此投射不可能) )。

想象一下,有可能将Int转换为关闭Any。现在,用户可以将Int以外的对象传递给闭包,渲染类型检查无关紧要。这就是为什么不允许在这样的闭包类型中进行投射。

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

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