Swift中的泛型枚举

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)

Swift中的枚举,尤其是关联值,功能强大得令人难以置信。ReactiveCocoa使用它们为其
事件
类建模,并为其
结果
类建模。泛型也同样强大

但也存在一些明显的局限性。比如说,我正在构建一个服务类来抽象出应用程序中获取数据的不同方式。表示“服务”的枚举可能如下所示:

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> ...