【发布时间】:2022-10-16 18:28:15
【问题描述】:
我正在做一种分派用例的方法。它工作得很好,但是我在 swift 中被泛型类型阻止了。
一个负责注册可观察通道的抽象类,需要捕获通用句柄输出以查看它是句柄成功还是错误,从而驱动正确的通道句柄。
此刻,我的演员产生了一个异常:
无法转换类型的值
'ios_pokedex_clean.ValueOutput<ios_pokedex_clean.Landing>' (0x205ea7900) 到 'ios_pokedex_clean.Output<Any>' (0x205ea8010)。
Landing 是视图所期望的类,并且是仅在视图中的知识。
但是当我留在 BaseViewController 中时,我不需要知道 Output 中的类是什么。仅当 notification.object 是类输出类型时。 我需要做什么才能获得预期的行为?
class Landing : Any{ //it's a way? ... }
【问题讨论】:
-
handleSuccess(value:)方法的签名是什么?看起来您需要知道value的类型才能调用它。Output的参数类型是用来做什么的(是value的类型吗?) -
Swift 泛型类型不是协变的,这就是强制转换失败的原因。泛型可能不是您在这里寻找的答案。协议或子类可能更合适
-
@RobNapier func handleSuccess(值:任何?)
-
@Paulw11 感谢您的帮助。我去想想。。
-
Any 的大量使用表明设计中存在真正的问题。特别是如果你看到
Any?出现,你会遇到很多问题。这是一个类型的噩梦,因为当它与泛型混合时,它可以以奇怪的方式隐式提升(它可以自动变成Any??、Any???甚至更糟,你最终会陷入嵌套的 Optional 的海洋)。我将首先探索用更类型安全的解决方案(如委托、闭包甚至组合发布者)替换 NotificationCenter。