通过枚举访问 Class 个变量

Accessing Class Variables by enum

我有以下代码,基本上为不同的公司定义了枚举,为每个公司定义了不同的方法。

protocol Fetcher {
    func getDetail()
    static var idRegex:String {get}
}
class FooFetcher:Fetcher {
    static var idRegex = "(^\d{5}$)"
    var company = Company.Foo

    init (name:String?, id:String) {
        println("Name: \(name) id: \(id)")
    }

    func getDetail() {
        println("Foo Get detail")
    }
}

class BarFetcher:Fetcher {
    static var idRegex = "(^\d{11}$)"
    var company = Company.Bar

    init (name:String?, id:String) {
        println("Name: \(name) id: \(id)")
    }

    func getDetail() {
        println("Bar Get detail")
    }
}

enum Company:Int {
    case Foo
    case Bar

    func fetcher(name:String?, id:String) -> AnyObject {
        switch self {
        case Foo:
            return FooFetcher(name: name, id: id)
        case .Bar:
            return BarFetcher(name: name, id: id)
        }
    }

}

var compList = [Company.Foo , Company.Bar]

如何仅使用 compList 数组获取 idRegex?我不想创建另一个像 [FooFetcher.idRegex,BarFetcher.idRegex] 这样的数组,因为它会使文件膨胀。我想使用枚举,因为使用 Core Data 很容易存储它们的 rawValue。

我还想知道如何为 Company 枚举编写更好的提取器函数。目前我使用像下面这样的 fetcher 函数

var company = Company.Foo
var strategy = company.fetcher("Some name", id: "Some id") as! Fetcher
strategy.getDetail()

AnyObject不支持Fetcher,在company.fetcher函数中返回的AnyObject不是-> Fetcher

enum Company:Int {
    case Foo
    case Bar

    func fetcher(name:String?, id:String) -> Fetcher {
        switch self {
        case .Foo:
            return FooFetcher(name: name, id: id)
        case .Bar:
            return BarFetcher(name: name, id: id)
        }
    }

}

FOO也差不多对应.foo

连同 eliasRuizHz 的回答,向 Company 枚举添加一个新的 regex 方法。

func regex() -> String {
    switch self {
    case .Foo:
        return FooFetcher.idRegex
    case .Bar:
        return BarFetcher.idRegex
    }
}

这两个响应都提供了很好的贡献。例如,return使用 Fetcher 而不是 AnyObject 是完全有意义的,就像 regex() 函数一样。然而,我想问的是,您是否可以使用具有关联值的枚举而不是这种枚举 + class 方法,但如果您真的想直接访问 .来自实例的 idRegex 那么它需要是一个常规实例变量而不是 class 变量。两种方式的一种方法是通过实例变量 return 类型变量,如下所示:

protocol Fetcher {
    func getDetail()
    var idRegex:String {get}
    static var regex:String {get}
}
class FooFetcher:Fetcher {
    static var regex = "(^\d{5}$)"
    var idRegex:String { return FooFetcher.regex }
    var company = Company.Foo

    init (name:String?, id:String) {
        println("Name: \(name) id: \(id)")
    }

    func getDetail() {
        println("Foo Get detail")
    }
}

class BarFetcher:Fetcher {
    static var regex = "(^\d{11}$)"
    var idRegex:String { return BarFetcher.regex }
    var company = Company.Bar

    init (name:String?, id:String) {
        println("Name: \(name) id: \(id)")
    }

    func getDetail() {
        println("Bar Get detail")
    }
}

enum Company:Int {
    case Foo
    case Bar

    func fetcher(name:String?, id:String) -> Fetcher {
        switch self {
        case Foo:
            return FooFetcher(name: name, id: id)
        case .Bar:
            return BarFetcher(name: name, id: id)
        }
    }

}

var compList = [Company.Foo, Company.Bar]
var company = Company.Foo
var strategy = company.fetcher("Some name", id: "Some id")
strategy.getDetail()
strategy.idRegex

编辑回复查询

如果您希望 fetcher 不必初始化实例,则设置任何要求以确定是否 returned 是值还是 nil。

enum Company:Int {
    case Foo
    case Bar

    func fetcher(name:String?, id:String) -> Fetcher? {
        switch self {
        case Foo:
            if FooFetcher.regex == "(^\d{11}$)" {
                return FooFetcher(name: name, id: id)}
            else {return nil}
        case .Bar:
            if BarFetcher.regex == "(^\d{11}$)" {
                return BarFetcher(name: name, id: id)
            }
            else {return nil}
        }
    }

}

var compList = [Company.Foo, Company.Bar]
var company = Company.Foo
var strategy = company.fetcher("Some name", id: "Some id")
strategy?.getDetail()
strategy?.idRegex