我有以下描述国家的课程:
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
但是,我希望能够使用String
从convenience init?(named name: String)
获取此常量,如下所示:
let england = Country(named: "England")
这似乎有些笨拙,并且此代码初始化了一个新的“ england
”实例,而不是采用静态实例。
是否有更快捷的方法?理想情况下,我只想在self = country
函数中使用convenience init?(named name: String)
,但出现错误无法赋值:“自我”是不可变的。
感谢您的帮助。
答案 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
}
}