Swift调度器任务中的泛型类型问题求助
Swift泛型Output类型判断问题解决方案
核心问题原因
Swift泛型默认是不变的,ValueOutput<Landing>和Output<Any>属于完全不同的类型,无法直接强制转换。要在BaseViewController中脱离具体泛型参数判断类型,得用非泛型协议来抽象Output的共性。
具体实现步骤
- 定义非泛型的Output协议
先定义一个不带泛型的协议,用来标记所有输出类型,并包含成功/错误判断的必要标识:
protocol Output { var outputType: OutputType { get } } enum OutputType { case success case failure }
- 让泛型ValueOutput遵循该协议
让原来的泛型ValueOutput实现这个协议,同时保留自身的泛型业务逻辑:
class ValueOutput<T>: Output { let value: T let outputType: OutputType // 根据业务场景初始化,比如成功场景传入对应值和.success init(value: T, outputType: OutputType) { self.value = value self.outputType = outputType } }
- BaseViewController中判断类型并处理
现在无需知晓具体的泛型参数(比如Landing),只需判断对象是否符合Output协议,再根据协议属性区分逻辑:
// 通知回调示例 if let output = notification.object as? Output { switch output.outputType { case .success: handleSuccess() case .failure: handleFailure() } }
关于你尝试的Landing : Any
这个写法没有任何作用,Swift中所有类型默认都隐式继承自Any,手动声明不会改变类型特性,解决不了泛型类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Caio Sanchez Christino
相关产品推荐
相关产品推荐

