【问题标题】:How to access associate enum in generic way in swift如何以通用方式快速访问关联枚举
【发布时间】:2018-09-11 07:37:38
【问题描述】:

我正在尝试理解 swift 枚举,为此,我决定使用关联的枚举创建一个数据源。现在我不确定我的问题行是否正确,但我会尝试解释我究竟想在这里做什么。

  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'。我怎样才能使它更通用,以便根据我可以找到的国家/地区?

【问题讨论】:

  • 我知道这是一个学习练习,但您永远不会使用枚举来编写一长串名称。
  • 为什么不使用枚举而使用结构体?
  • 该结构将仅具有代表单个城市的属性。实际的城市列表将来自数据文件或数据库。该列表不会被硬编码到您的代码中。

标签: swift generics enums


【解决方案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
}

方案一:将你当前返回的类型转换为相同的类型,并将该类型作为返回类型

例子:

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
}

【讨论】:

    【解决方案2】:

    对于您的示例,我不会使用enums。这是因为您想要存储有关城市的其他信息(例如,如果它是首都)。相反,我会使用一个名为Citystruct 来封装您的所有信息。然后你可以有一个变量chinaCitiesusCities,它是一个包含所有相应城市的数组。

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

    enum City: String {
        case beijing = "beijing"
        case newYork = "new york"
    }
    

    当然,如果你这样做,你还必须做额外的工作来跟踪一个城市是否是一个变量。实现此目的的一种方法是使用一个函数,该函数接收 City enum 并返回 truefalse,具体取决于它是否为大写字母。

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

    【讨论】:

    • 我现在正在考虑使用struct。
    • 如果你喜欢我的回答,你能接受它作为这个问题的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多