如何获取rawType为Int的枚举的字符串大小写

时间:2017-03-21 10:13:33

标签: swift enums

我想要列举一些国家/地区,例如:

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

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

  1. 我想确定此枚举的总数,使用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
        }()
    }
    
  2. 我还需要一个代表一个国家的复杂数据结构,并且有一个数组结构的数组。我可以使用Int-valued枚举轻松地从这个数组下标访问某个国家。

    struct CountryData {
         var population: Int
         var GDP: Float
    }
    
    var countries: [CountryData]
    
    print(countries[Country.Afghanistan.rawValue].population)
    
  3. 现在,我不知何故需要将某个Country个案转换为String(又名

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

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

    那么,我怎样才能立刻获得这些功能?:

    1. 使用枚举,以便在编译期间找到潜在的拼写错误导致的错误。 (Country.Afganistan不会编译,应该有一个' h'''以及某些方法,如国家[" Afganistan"]将编译并可能导致运行时错误)
    2. 能够以编程方式确定国家/地区总数(可能在编译时确定,但我不想使用字面值,并且每次添加时都要记住正确更改或删除国家/地区)
    3. 能够轻松下标访问元数据数组。
    4. 能够获得case
    5. 的字符串

      使用enum Country: Int满足1,2,3但不满足4

      使用enum Country: String满足1,3,4但不满足2(使用Dictionary而不是Array)

1 个答案:

答案 0 :(得分:7)

要将enum's个案打印为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)