Swift中的泛型枚举
Swift中的枚举,尤其是关联值,功能强大得令人难以置信。ReactiveCocoa使用它们为其Swift中的泛型枚举,swift,generics,enums,Swift,Generics,Enums,Swift中的枚举,尤其是关联值,功能强大得令人难以置信。ReactiveCocoa使用它们为其事件类建模,并为其结果类建模。泛型也同样强大 但也存在一些明显的局限性。比如说,我正在构建一个服务类来抽象出应用程序中获取数据的不同方式。表示“服务”的枚举可能如下所示: enum Service<T: Object, U: NSManagedObject, V> { case Realm(T.Type) case CoreData(U.Type, String)
事件
类建模,并为其结果
类建模。泛型也同样强大
但也存在一些明显的局限性。比如说,我正在构建一个服务类来抽象出应用程序中获取数据的不同方式。表示“服务”的枚举可能如下所示:
enum Service<T: Object, U: NSManagedObject, V> {
case Realm(T.Type)
case CoreData(U.Type, String)
case Network(V.Type, NSURL, String)
}
人们有理由期望能够将这些服务存储在某种类型的管理器中,然后检索它们:
ServiceManager.services[.Realm(Object.self)]
但是由于通用约束,T、U和V必须提前知道,并且当存储在字典中时,T、U和V对于所有存储的枚举都必须具有相同的类型
另一个问题是服务方法。对于上面的find
函数示例,如果消费者能够指定退货型号,那就太好了:
func find<Model>(parameters: [String: AnyObject])->SignalProducer<[Model], NSError>
这似乎在一开始就违背了通用约束的目的
没有办法在Swift中“选择性地要求”泛型类型,是吗?大概看起来像:
func find<T where self == .Realm || self == .Network || self == .CoreData> ...
func查找。。。
换句话说,似乎没有一种方法可以基于枚举本身的值应用一组通用约束
typealias T = Object
typealias U = NSManagedObject
typealias V = Any
private var registeredServices: [Service<T, U, V>]
func find<T where self == .Realm || self == .Network || self == .CoreData> ...