我试图理解快速枚举,为此,我决定使用关联的枚举创建数据源。现在我不确定我的问题线是否正确,但我将尝试解释我在这里到底要做什么。
Struct SampleClass {
enum Country: String {
case US(cityList: ChianCityList)
case Chian(cityList: USCityList)
}
enum ChianCityList {
case Bijing
case Shanghai
static var allCases = [.Bijing, .Shanghai]
}
enum USCityList {
case NewYork
case LA
static var allCases = [.NewYork, .LA]
var isCaptial:Bool
}
var country: Country
var allCityList: [?] {
switch self.conuntry {
case Chian
return CityList.allCases
case US
return USCityList.allCases
}
init(country: Country)
{
self.country = Country
}
}
现在我不知道var'allCityList'的返回类型是什么。我希望它是通用的。其次,我不想为每个枚举调用“ allCases”。反正有使其通用的地方吗?这只是一个简单的例子,有很多这样的场景。就像“ isCaptial”一样。我如何才能使其更通用,以便根据我所在的国家/地区来查找?
答案 0 :(得分:1)
当前,USCityList
和ChinaCityList
是两种不同的类型。如果返回一种类型,则无法返回另一种。您有两种选择。
enum ChianCityList {
case Bijing
case Shanghai
static var allCases = [.Bijing, .Shanghai]
}
enum USCityList {
case NewYork
case LA
static var allCases = [.NewYork, .LA]
var isCaptial:Bool
}
示例:
enum ChianCityList: String, CaseIterable {
case Bijing
case Shanghai
}
enum USCityList: String, CaseIterable {
case NewYork
case LA
var isCaptial:Bool
}
extension CaseIterable {
var allCasesToStrings: [String] {
return allCases.map{ String(describing: $0) }
}
var allCityList: [String] {
switch self.conuntry {
case Chian
return CityList.allCasesToStrings
case US
return USCityList.allCasesToStrings
}
示例:
protocol CityList {
var cityList: [String] { get }
Var capitalCity: String { get }
}
// Have both implement the protocol
var allCityList: CityList {
switch self.conuntry {
case Chian
return CityList.cityList
case US
return USCityList.cityList
}
答案 1 :(得分:0)
在您的示例中,我不会使用enum
。这是因为您要存储有关城市的其他信息(例如,如果是首都)。相反,我将使用一个名为struct
的{{1}}来封装您的所有信息。然后,您可以拥有一个变量City
和chinaCities
,该变量是其所有各自城市的数组。
如果您真的想强制使用usCities
,我将创建一个名为enum
的巨型enum
并将City
s数组存储到两个单独的变量中区分他们的位置。
City
当然,如果要这样做,则还必须做一些额外的工作来跟踪城市是否为变量。实现此目的的一种方法是拥有一个接受enum City: String {
case beijing = "beijing"
case newYork = "new york"
}
City
并根据其是否为大写字母返回enum
或true
的函数。
作为一个旁注,我只想指出您拼写错误的false
和China
。希望这会有所帮助!