如何以通用方式快速访问关联枚举

时间:2018-09-10 21:31:42

标签: swift generics enums

我试图理解快速枚举,为此,我决定使用关联的枚举创建数据源。现在我不确定我的问题线是否正确,但我将尝试解释我在这里到底要做什么。

  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”一样。我如何才能使其更通用,以便根据我所在的国家/地区来查找?

2 个答案:

答案 0 :(得分:1)

当前,USCityListChinaCityList是两种不同的类型。如果返回一种类型,则无法返回另一种。您有两种选择。

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
}

选项1:将您当前返回的类型转换为相同的类型,并将其作为返回类型

示例:

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
}

选项2:使两种类型都遵循相同的协议,然后返回该协议的实例。

示例:

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}}来封装您的所有信息。然后,您可以拥有一个变量CitychinaCities,该变量是其所有各自城市的数组。

如果您真的想强制使用usCities,我将创建一个名为enum的巨型enum并将City s数组存储到两个单独的变量中区分他们的位置。

City

当然,如果要这样做,则还必须做一些额外的工作来跟踪城市是否为变量。实现此目的的一种方法是拥有一个接受enum City: String { case beijing = "beijing" case newYork = "new york" } City并根据其是否为大写字母返回enumtrue的函数。

作为一个旁注,我只想指出您拼写错误的falseChina。希望这会有所帮助!