Ios 快速关闭不能覆盖任何

Ios 快速关闭不能覆盖任何,ios,swift,closures,Ios,Swift,Closures,也许这是个愚蠢的问题,但我还没有找到任何解决办法。所以,我的问题是,有一个事件发射器协议,其功能如下: mutating func on(eventName:String, action:((Any?)->())) { //.. } 我想用它来通知听众,无论什么时候,一个事件被一些信息触发。例如,“登录”事件的访问令牌 然后我得到一个错误,我不能用类型为的参数列表调用“on”。当然,它适用于任何: appSessionHadler.on("login") { (weak data

也许这是个愚蠢的问题,但我还没有找到任何解决办法。所以,我的问题是,有一个事件发射器协议,其功能如下:

mutating func on(eventName:String, action:((Any?)->())) {
    //..
}
我想用它来通知听众,无论什么时候,一个事件被一些信息触发。例如,“登录”事件的访问令牌

然后我得到一个错误,我不能用类型为的参数列表调用“on”。当然,它适用于任何:

appSessionHadler.on("login") { (weak data: Any?) in
    //...
}
每件事都符合任何规则,所以我是一个有点困惑的人。有人能解释一下吗


我可以用一个通用协议来解决这个问题,但它仍然让我感到沮丧,因为它不能像这样工作。

你做出了编译器无法兑现的承诺。
on
函数可以自由调用任何类型的数据的
action
。但是您传递的函数只接受
字符串
。如果上的
包含以下代码(直接或间接),系统应该怎么做:

1
不是
字符串,因此类型安全性将被破坏。编译器不能让你这么做

考虑这一点的另一种方式是,
上的
采用类型为
F
的函数,您传递的是
F
的超类型,而不是
F
的子类型
String
Any
的子类型。但函数参数的工作顺序相反
(String)->Void
(Any)->Void
的超类型。因此,这与将类型为
Any
的变量传递给需要
String
的函数相同。形式上,我们说函数的参数是逆变的,返回值是协变的。您可以在中阅读更多关于这方面的内容


正如您所怀疑的,泛型是正确的答案<代码>任何
几乎总是错误的工具。而
Any?
是Swift中最难使用的类型之一,因此我肯定会不惜一切代价避免使用这种类型。(
Optional
本身就是
Any
的一个子类型,而且Swift自动升级到
Optional
,所以当你有
Any时,开始获得双选项和更糟的选项是很常见的。)

非常感谢,在仔细考虑之后,它是完全清楚的:)现在它的工作方式是:
变异函数on(eventName:String,action:((T?)->())
appSessionHadler.on("login") { (weak data: Any?) in
    //...
}
action(1)