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)