如果我有一个原始整型值的枚举:

enum City: Int {
  case Melbourne = 1, Chelyabinsk, Bursa
}

let city = City.Melbourne

如何将城市值转换为字符串墨尔本?这种类型名称内省在语言中可用吗?

类似于(这段代码将不起作用):

println("Your city is \(city.magicFunction)")
> Your city is Melbourne

当前回答

Swift现在有所谓的隐式分配原始值。基本上,如果您不为每个case提供原始值,并且枚举类型为String,则它推断出case的原始值本身为字符串格式。去试试吧。

enum City: String {
  case Melbourne, Chelyabinsk, Bursa
}

let city = City.Melbourne.rawValue

// city is "Melbourne"

其他回答

目前在枚举情况下没有自省。你必须手动声明它们:

enum City: String, CustomStringConvertible {
    case Melbourne = "Melbourne"
    case Chelyabinsk = "Chelyabinsk"
    case Bursa = "Bursa"

    var description: String {
        get {
            return self.rawValue
        }
    }
}

如果你需要原始类型是Int,你必须自己做一个切换:

enum City: Int, CustomStringConvertible {
  case Melbourne = 1, Chelyabinsk, Bursa

  var description: String {
    get {
      switch self {
        case .Melbourne:
          return "Melbourne"
        case .Chelyabinsk:
          return "Chelyabinsk"
        case .Bursa:
          return "Bursa"
      }
    }
  }
}

迅速:

extension UIDeviceBatteryState: CustomStringConvertible {

    public var description: String {
        switch self {
        case .unknown:
            return "unknown"
        case .unplugged:
            return "unplugged"
        case .charging:
            return "charging"
        case .full:
            return "full"
        }
    }

}

如果你的变量是“batteryState”,那么调用:

self.batteryState.description

这太令人失望了。

当你需要这些名字的时候(编译器完全知道这些名字的准确拼写,但拒绝访问)——谢谢Swift团队!!——)但不想或不能让String作为枚举的基,一个冗长、麻烦的替代方法如下:

enum ViewType : Int, Printable {

    case    Title
    case    Buttons
    case    View

    static let all = [Title, Buttons, View]
    static let strings = ["Title", "Buttons", "View"]

    func string() -> String {
        return ViewType.strings[self.rawValue]
    }

    var description:String {
        get {
            return string()
        }
    }
}

您可以使用上述如下:

let elementType = ViewType.Title
let column = Column.Collections
let row = 0

println("fetching element \(elementType), column: \(column.string()), row: \(row)")

您将得到预期的结果(列的代码类似,但没有显示)

fetching element Title, column: Collections, row: 0

在上面,我已经使description属性引用回string方法,但这是一个品味问题。还要注意,所谓的静态变量需要通过其封闭类型的名称来限定作用域,因为编译器太健忘了,无法自行召回上下文…

斯威夫特团队必须得到真正的指挥。他们创建了枚举,你不能枚举,你可以使用枚举是“序列”,但不是enum!

String(description:)初始化式可以用来返回case标签名称,即使是对于非String rawValues的枚举:

enum Numbers: Int {
    case one = 1
    case two = 2
}

let one = String(describing: Numbers.one) // "one"
let two = String(describing: Numbers.two) // "two"

注意,如果枚举使用了@objc修饰符,这将不起作用:

在Swift中获取Objective-C @objc enum值的字符串名称? 为什么Enum返回“EnumName”而不是“caseLabel”的字符串(描述:)?

为Objective-C类型生成的Swift接口有时不包括@objc修饰符。这些枚举是在Objective-C中定义的,因此不像上面那样工作。

我遇到了这个问题,想分享一个创建magicFunction的简单方法

enum City: Int {
  case Melbourne = 1, Chelyabinsk, Bursa

    func magicFunction() -> String {
        return "\(self)"
    }
}

let city = City.Melbourne
city.magicFunction() //prints Melbourne