【发布时间】:2019-05-31 06:50:05
【问题描述】:
总结:
我想创建一个Class<T>,其中有一个对应的ClassDelegate 协议,其中包含func<T>。
目标:
使用多个对象类重用单个对象和行为。接收已具有专用类的委托回调,而无需将对象强制转换为特定类以使用它。
示例代码:
具有通用方法的协议:
protocol GenericTableControllerDelegate: AnyObject {
func controller<T>(controller: GenericTableController<T>, didSelect value: T)
}
通用基础UITableViewController 子类:
open class GenericTableController<DataType>: UITableViewController {
weak var delegate: GenericTableControllerDelegate?
var data = [DataType]()
open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item = data[indexPath.row]
delegate?.controller(controller: self, didSelect: item)
}
}
GenericTableController 的专用版本:
final class SpecializedTableController: GenericTableController<NSObject> {}
SpecializedTableController 的客户端 - 实现结果,但需要类型转换才能访问专用数据类型:
final class ClientOfTableController: UIViewController, GenericTableControllerDelegate {
// Works OK
func controller<T>(controller: GenericTableController<T>, didSelect value: T) {
if let value = value as? NSObject {
// Requires unwrapping and casting
}
}
}
SpecializedTableController 的客户端,具有“where”要求 - 唯一无法编译的问题
final class AnotherClientOfTableController: UIViewController, GenericTableControllerDelegate {
// Works OK
func controller<T>(controller: GenericTableController<T>, didSelect value: T) where T: NSObject {
// `value` is String
}
}
类型“AnotherClientOfTableController”不符合协议 'GenericTableControllerDelegate' 你想添加协议存根吗?
有没有办法让协议具有通用方法并能够在该方法实现中具有具体(专用)类型?
是否存在满足类似要求的相近替代方案(具有泛型类但能够在委托回调中处理具体类型)?
【问题讨论】:
标签: ios swift generics protocols swift-protocols