Swift中的泛型枚举

Swift中的枚举,尤其是相关的值,非常强大。 ReactiveCocoa使用它们来为它们的Result类建模它们的Event类和Alamofire。 泛型也同样强大。

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

enum Service<T: Object, U: NSManagedObject, V> {
    case Realm(T.Type)
    case CoreData(U.Type, String)
    case Network(V.Type, NSURL, String)
}

然后枚举将有如下方法:

func find(parameters: [String: AnyObject])
func get(id: String)

人们会合理地期望能够将这些服务存储在某种类型的管理器中,然后再检索它们:

ServiceManager.services[.Realm(Object.self)]

但由于通用约束条件,T,U和V必须提前知道,并且当存储在字典中时,对于所有存储的枚举,T,U和V都必须是相同类型的。

另一个问题是服务方法。 通过find函数的上面的例子,如果消费者可以指定返回模型类型,那将会很棒:

func find<Model>(parameters: [String: AnyObject])->SignalProducer<[Model],  NSError>

但是,基于关联枚举的值,泛型类型Model的约束需要改变。

有没有办法将泛型类型存储为字典值? 我发现一个可能的解决方法,在它们被存储的类中,使用typealias来匹配约束。

typealias T = Object
typealias U = NSManagedObject
typealias V = Any

private var registeredServices: [Service<T, U, V>]

这似乎首先打破了通用约束的目的。

Swift中没有办法“有选择地需要”泛型类型吗? 一些大致看起来像这样的东西:

func find<T where self == .Realm || self == .Network || self == .CoreData> ...

换句话说,似乎没有办法根据枚举本身的值应用一组通用约束。

链接地址: http://www.djcxy.com/p/54423.html

上一篇: Generic Enums in Swift

下一篇: Generic enum constraint