Swift:将枚举值转换为String?

ma1*_*w28 120 string enums swift

鉴于以下枚举:

enum Audience {
    case Public
    case Friends
    case Private
}
Run Code Online (Sandbox Code Playgroud)

如何"Public"audience下面的常量中获取字符串?

let audience = Audience.Public
Run Code Online (Sandbox Code Playgroud)

GoZ*_*ner 190

"获取字符串"的惯用接口是使用CustomStringConvertible接口并访问descriptiongetter.将您定义enum为:

enum Foo : CustomStringConvertible {
  case Bing
  case Bang
  case Boom

  var description : String { 
    switch self {
    // Use Internationalization, as appropriate.
    case .Bing: return "Bing"
    case .Bang: return "Bang"
    case .Boom: return "Boom"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在行动:

 > let foo = Foo.Bing
foo: Foo = Bing
 > println ("String for 'foo' is \(foo)"
String for 'foo' is Bing
Run Code Online (Sandbox Code Playgroud)

更新:对于Swift> = 2.0,替换PrintableCustomStringConvertible

注意:使用CutomStringConvertible允许Foo采用不同的原始类型.例如enum Foo : Int, CustomStringConvertible { ... }是可能的.这种自由可能很有用.

  • @ JohnM.P.Knox不要忘记反斜杠,因为"String for'foo'是\\(foo)".**编辑**好吧,这是编辑器摆脱它,我必须输入其中的2个才能显示出来 (3认同)
  • `CustomStringConvertible`允许/要求你定义`description`,它允许你决定每个enum case使用什么字符串 - 这对国际化肯定很重要,也许代码可读性很重要.如果你不关心那些,那么你可以使用'enum Foo:String {/*...*/}` (3认同)
  • 另一种创建println字符串的简短方法是:"'foo'的字符串是\(foo)" (2认同)
  • 这应该标记为正确的答案 (2认同)
  • 如果您的枚举不是String,或者您想要一个与rawValue不同的字符串,那么这是正确的答案.@ denis631 (2认同)

Dev*_*ist 127

不确定在哪个Swift版本中添加了这个功能,但是现在(Swift 2.1)你只需要这个代码:

enum Audience : String {
    case public
    case friends
    case private
}

let audience = Audience.public.rawValue // "public"
Run Code Online (Sandbox Code Playgroud)

当字符串用于原始值时,每个案例的隐含值是该案例名称文本.

[...]

enum CompassPoint : String {
    case north, south, east, west
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,CompassPoint.south具有隐含的原始值"south",依此类推.

您可以使用其rawValue属性访问枚举案例的原始值:

let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"
Run Code Online (Sandbox Code Playgroud)

资源.

  • 在xcode7.3 swift2.2中,如果我这样做:`print("appState:\(application.applicationState)")`我得到`appState:UIApplicationState`这是类型,而不是枚举值的实际字符串表示.我在这里错过了什么吗?(PS:对于rawValue我只获得Int值...) (6认同)

ma1*_*w28 31

现在,我将重新定义枚举为:

enum Audience: String {
    case Public = "Public"
    case Friends = "Friends"
    case Private = "Private"
}
Run Code Online (Sandbox Code Playgroud)

这样我才能做到:

audience.toRaw() // "Public"
Run Code Online (Sandbox Code Playgroud)

但是,这个新的枚举定义不是多余的吗?我可以保留初始枚举定义并执行以下操作:

audience.toString() // "Public"
Run Code Online (Sandbox Code Playgroud)

  • 从Xcode 7 Beta 3开始,您可以编写您的答案,但不使用`= String`,因为如果您不提供任何原因,它会自动获得原始值(案例名称). (3认同)
  • 而不是.toString()现在使用.rawValue (3认同)

Sim*_*e99 24

我喜欢PrintableRaw Values.

enum Audience: String, Printable {
    case Public = "Public"
    case Friends = "Friends"
    case Private = "Private"

    var description: String {
        return self.rawValue
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以这样做:

let audience = Audience.Public.description // audience = "Public"
Run Code Online (Sandbox Code Playgroud)

要么

println("The value of Public is \(Audience.Public)") 
// Prints "The value of Public is Public"
Run Code Online (Sandbox Code Playgroud)


Dan*_*nov 24

在swift 3中,你可以使用它

var enumValue = Customer.Physics
var str = String(describing: enumValue)
Run Code Online (Sandbox Code Playgroud)

来自Swift如何使用enum来获取字符串值

  • 这真的很有帮助,特别是如果我的 `enum` 不是基于 `String`s (4认同)
  • `"\(enumValue)"` 做同样的事情。^^ (3认同)

par*_*par 12

更新了Xcode 7 GM的发布.它现在有人希望 - 感谢Apple!

enum Rank:Int {
    case Ace = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King
}

let r = Rank.Ace

print(r)               // prints "Ace"
print("Rank: \(r)!")   // prints "Rank: Ace!"
Run Code Online (Sandbox Code Playgroud)

  • 在Swift 2.0中,符合`CustomStringConvertible`实际上允许在这种情况下只使用`print(r)`. (2认同)

gbd*_*vid 10

在Swift 2和最新的Xcode 7中没有比这更简单(不需要指定枚举类型,或.rawValue,描述符等......)

针对Swift 3和Xcode 8进行了更新:

    enum Audience {
        case Public
        case Friends
        case Private
    }

    let audience: Audience = .Public  // or, let audience = Audience.Public
    print(audience) // "Public"
Run Code Online (Sandbox Code Playgroud)

  • 最初的问题是关于在你自己的枚举中将枚举值转换为字符串,这就是我给出的答案......如果你想要处理UIKit/AppKit Enums,当然这是一个不同的故事. (2认同)

tsu*_*imi 9

如果在 Enum 中使用 Ints 的 swift 3 及以上示例

public enum ECategory : Int{
        case Attraction=0, FP, Food, Restroom, Popcorn, Shop, Service, None;
        var description: String {
            return String(describing: self)
        }
    }

let category = ECategory.Attraction
let categoryName = category.description //string Attraction
Run Code Online (Sandbox Code Playgroud)

  • 一个优雅的解决方案。“\\(category)”或直接 String(describing:category) 也可以。即使对于 Int 枚举也是如此。 (2认同)

小智 9

您还可以使用"\(enumVal)" 下面是一个示例:

enum WeekDays{ case Sat, Sun, Mon, Tue, Wed, The, Fri } 

let dayOfWeek: String = "\(WeekDays.Mon)"
Run Code Online (Sandbox Code Playgroud)

在 Swift 5 中尝试和测试


Adr*_*oni 5

在尝试了几种不同的方法后,我发现如果您不想使用:

let audience = Audience.Public.toRaw()
Run Code Online (Sandbox Code Playgroud)

您仍然可以使用结构对其进行存档

struct Audience {
   static let Public  = "Public"
   static let Friends = "Friends"
   static let Private = "Private"
}
Run Code Online (Sandbox Code Playgroud)

那么你的代码:

let audience = Audience.Public
Run Code Online (Sandbox Code Playgroud)

将按预期工作。它不漂亮,并且有一些缺点,因为您没有使用“枚举”,您不能使用仅添加 .Private 的快捷方式,也不适用于 switch case。


Viv*_*ani 5

对于阅读"Swift编程语言"的"A Swift Tour"章节中的示例并寻找简化simpleDescription()方法的方法的人来说,通过执行String(self)将enum本身转换为String 将执行以下操作:

  enum Rank: Int
  {
    case Ace = 1 //required otherwise Ace will be 0
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
        switch self {
            case .Ace, .Jack, .Queen, .King:
                return String(self).lowercaseString
            default:
                return String(self.rawValue)
        }
     }
   }
Run Code Online (Sandbox Code Playgroud)

  • 请确保您没有使用带有“@objc”的枚举。这导致这种方法失败。 (2认同)

ios*_*ist 5

从 Swift 3.0 开始你可以

var str = String(describing: Audience.friends)
Run Code Online (Sandbox Code Playgroud)

  • 令人难以置信,但这完全有效。比“惯用”方法短得多。谢谢! (3认同)