提问者:小点点

如何获取rawType为Int[重复]的枚举的字符串大小写名称


我想要一个国家的枚举,如:

enum Country: Int {
    case Afghanistan
    case Albania
    case Algeria
    case Andorra
    //...
}

我选择Int作为其rawValue类型的主要原因有两个:

>

  • 我想确定这个枚举的总计数,使用Int作为rawValue类型简化了这一点:

    enum Country: Int {
        case Afghanistan
        // other cases
        static let count: Int = {
            var max: Int = 0
            while let _ = Country(rawValue: max) { max = max + 1 }
            return max
        }()
    }
    

    我还需要一个表示一个国家的复杂数据结构,并且有一个该数据结构的数组。我可以使用Int值枚举轻松地从这个数组中下标访问某个国家。

    struct CountryData {
         var population: Int
         var GDP: Float
    }
    
    var countries: [CountryData]
    
    print(countries[Country.Afghanistan.rawValue].population)
    

    现在,我不知何故需要将某个国家案例转换为字符串(又名。类似

    let a = Country.Afghanistan.description // is "Afghanistan"
    

    由于有很多情况,手动编写类似转换表的函数似乎是不可接受的。

    那么,如何一次获得这些功能呢?:

    1. 使用枚举,以便在编译期间发现潜在的错别字引起的错误。(Country. Afganstein不会编译,'g'后面应该有一个'h',但某些方法(如国家["Afgan不斯坦"])会编译并可能导致运行时错误)
    2. 能够以编程方式确定国家总数(可能能够在编译时确定,但我不想使用文字值,并记住每次添加或删除国家时都要正确更改它)
    3. 能够像下标一样轻松访问元数据数组。
    4. 能够获取case的字符串。

    使用枚举国家:Int满足1、2、3但不满足4

    使用枚举国家:字符串满足1、3、4但不满足2(使用字典而不是数组)


  • 共1个答案

    匿名用户

    要将枚举的大小写打印为String,请使用:

    String(describing: Country.Afghanistan)
    

    您可以创建如下数据结构:

    enum Country
    {
        case Afghanistan
        case Albania
        case Algeria
        case Andorra
    }
    
    struct CountryData
    {
        var name : Country
        var population: Int
        var GDP: Float
    }
    
    var countries = [CountryData]()
    countries.append(CountryData(name: .Afghanistan, population: 2000, GDP: 23.1))
    print(countries[0].name)