【问题标题】:Generic types on dispatcher job in swiftswift中调度员工作的通用类型
【发布时间】: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。

标签: ios swift


【解决方案1】:

考虑......这对我有用的是:

@objc func methodOfReceivedNotification(notification: Notification) {
    let state = ValueOutput(value: notification.object.self)
    if(state.isError()) {
        handleThrowable(error: state.error)
    } else {
        handleSuccess(value: state.value)
    }
}

ValueOutput(value: notification.object.self),避免演员。

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多