从字符串获取静态变量

时间:2018-09-03 09:29:57

标签: ios swift string static initialization

我有以下描述国家的课程:

class Country: NSObject {

    public var name: String

    static let england = Country(name: "England")
    static let scotland = Country(name: "Scotland")
    static let allCountries = [england, scotland]

    init(name: String) {
        self.name = name
        super.init()
    }

    convenience init?(named name: String) {
        guard let country = Country.allCountries.filter( { $0.name == name } ).first else { return nil }
        self.init(name: country.name)
    }

}

要获取常数Country.england,我将使用:

let england = Country.england

但是,我希望能够使用Stringconvenience init?(named name: String)获取此常量,如下所示:

let england = Country(named: "England")

这似乎有些笨拙,并且此代码初始化了一个新的“ england”实例,而不是采用静态实例。

是否有更快捷的方法?理想情况下,我只想在self = country函数中使用convenience init?(named name: String),但出现错误无法赋值:“自我”是不可变的

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

如果您的Country只有一个name,那么最好使用枚举…

enum Country: String, CaseIterable {
    case england = "England"
    case scotland = "Scotland"
}

Country(rawValue: "Scotland") // Optional(scotland)
Country(rawValue: "Wales")    // nil

注意CaseIterable是Swift 4.2+,但允许您编写Country.allCases

Country.allCases  // [england, scotland]

答案 1 :(得分:2)

代之以编写named工厂方法呢?

static func named(_ name: String) -> Country? {
    return Country.allCountries.first(where: { $0.name == name } )
}

// usage:
let england = Country.named("England")!

如果Country是一个结构,则可以使用初始化方法:

struct Country {

    public var name: String

    static let england = Country(name: "England")
    static let scotland = Country(name: "Scotland")
    static let allCountries = [england, scotland]

    init(name: String) {
        self.name = name
    }

    init?(named name: String) {
        guard let country = Country.allCountries.filter( { $0.name == name } ).first else { return nil }
        self = country
    }

}