概要:
我想创建一个 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
}
}
}
使用“where”要求的SpecializedTableController
客户端 - 唯一的问题是它无法编译
final class AnotherClientOfTableController: UIViewController, GenericTableControllerDelegate {
// Works OK
func controller<T>(controller: GenericTableController<T>, didSelect value: T) where T: NSObject {
// `value` is String
}
}
类型'AnotherClientOfTableController'不符合协议'GenericTableControllerDelegate',您是否想添加协议存根?
是否有一种方法可以使用泛型方法并能够在该方法实现中具体化(专门化)类型?
有没有类似的替代方案来满足类似的要求(拥有一个泛型类但能够在委托回调中处理具体类型)?
setDelegate
的想法绝对有趣。似乎Swift还没有以简洁易用的方式支持表达这种关系,因此我可能会使用你的或其他不同的方法来封装通用选择器。 - Richard Topchii