Swift:将枚举值转换为String吗?


141

鉴于以下枚举:

enum Audience {
    case Public
    case Friends
    case Private
}

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

let audience = Audience.Public

2
请检查此答案,它可能会给您一些有关如何实现此目标的想法:stackoverflow.com/questions/24648726/enums-with-data-in-swift / ...
Holex 2014年

在Swift 2和xcode7中,您无需对代码进行任何更改,只需使用print("\(audience)")
gbdavid

7
我讨厌Swift生态环境现在充满了这样的过时答案。从XCode8.2 / Swift3开始,它就像String(describing: yourEnumValue)
Travis Griggs

@TravisGriggs它不再适用于Xcode 11.4
DawnSong

Answers:


156

不确定此功能是在哪个Swift版本中添加的,但是现在(Swift 2.1)您只需要以下代码:

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

let audience = Audience.public.rawValue // "public"

如果将字符串用于原始值,则每种情况的隐式值都是该情况名称文本

[...]

enum CompassPoint : String {
    case north, south, east, west
}

在上面的示例中,CompassPoint.south的隐式原始值为“ south”,依此类推。

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

let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"

资源。


8
在xcode7.3 swift2.2中,如果我做类似的事情: print("appState: \(application.applicationState)") 我得到的 appState: UIApplicationState 是类型,而不是枚举值的实际字符串表示形式。我在这里想念什么吗?(PS:对于rawValue,我只获得Int值...)
马丁

@Cyrus您的方案与该线程中询问的方案不同。.rawValue将返回您的枚举的原始值。你的public enum UIApplicationState : Int确实是那种类型Int。您也从未读过我的答案,该答案引用了Apple文档的引文。...如果您仍然想转换UIApplicationState为字符串,建议您UIApplicationState使用自定义计算属性进行扩展extension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
DevAndArtist

使用非字符串类型的枚举不能解决问题
denis631

1
@ denis631是什么意思?枚举的原始类型可以是任何东西。一个枚举甚至可以遵从OptionSet您的意愿。最初的问题还是关于字符串。
DevAndArtist

1
如果我的枚举是这样写的,则枚举Test:Int {case A,B},rawValue当然会返回int,我们正在寻找的是一种以String形式获取案例名称的方法。这正是@DanilShaykhutdinov所做的。看一下他的回答,在原始问题中,枚举没有类型,不是String或Int。
denis631

209

“获取字符串”的惯用接口是使用该CustomStringConvertible 接口并访问description吸气剂。将您的定义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"
    }
  }
}

实际上:

 > let foo = Foo.Bing
foo: Foo = Bing
 > println ("String for 'foo' is \(foo)"
String for 'foo' is Bing

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

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


2
创建println字符串的另一种较短的方法是:“'foo'的字符串是(foo)”
John MP Knox

3
@ JohnM.P.Knox不要忘记反斜杠,因为“'foo'的字符串是\(foo)”中。编辑 OK,是摆脱它的编辑器,我必须输入其中的2个才能显示它
zmit 2015年

是什么在点CustomStringConvertible,如果这个工程就像罚款没有它?
Daniel van der Merwe

3
CustomStringConvertible允许/要求您定义description哪个变量,以便您决定为每个枚举大小写使用哪个字符串-这对于确保国际化以及代码的可读性非常重要。如果您不关心这些,则可以使用'enum Foo:String {/ * ... * /}`
GoZoner

2
如果您的枚举不是String或想要与rawValue不同的字符串,则这是正确的答案。@ denis631
Haagenti

32

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

enum Audience: String {
    case Public = "Public"
    case Friends = "Friends"
    case Private = "Private"
}

这样我就可以:

audience.toRaw() // "Public"

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

audience.toString() // "Public"

3
从Xcode 7 Beta 3开始,您只需编写答案即可,但无需编写答案,= String因为如果您不提供答案,它将自动获得原始值(案例名称)。
Qbyte

3
现在使用.rawValue代替.toString()
SoftDesigner 2015年

在Swift 1.2中,您可以使用:println(Audience.Friends.rawValue)
Oleg Popov


24

我喜欢用PrintableRaw Values

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

    var description: String {
        return self.rawValue
    }
}

然后我们可以做:

let audience = Audience.Public.description // audience = "Public"

要么

println("The value of Public is \(Audience.Public)") 
// Prints "The value of Public is Public"

1
我喜欢这种方式胜过选择的答案,因为我可以做到Audience(rawValue: "Friends")
tidwall

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!"

2
在Swift 2.0中,在这种情况下,遵循CustomStringConvertible实际上将允许使用print(r)
matm 2015年

在Xcode 7 beta 4中,reflect()似乎已被禁用,转而使用Mirror(reflecting:x)。但是,返回的对象具有不同的结构。
GSnyder

1
更新的答案,请
本·辛克莱尔

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"

与我的Int支持的枚举完美配合
chrislarson

只是一个观察:这适用于自己创建的枚举,但不适用于HKWorkoutActivityType
Ace Green

以及本地化的字符串;)
Eugene Braginets

2
最初的问题是关于将枚举值转换为您自己的枚举中的字符串,因此这就是我的答案。
gbdavid

1
@gbdavid-UIKit / AppKit枚举是否存在Q?我用谷歌搜索,找不到它。如果需要,我可以提交Q。
benc

8

如果在Enum中使用Ints,则为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

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

8

对于阅读了“ The Swift Programming Language”的“ A Swift Tour”一章中的示例并寻找一种方法来简化simpleDescription()方法的人来说,将枚举本身转换为String即可String(self)

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)
        }
     }
 }

2
只要确保您没有将枚举与“ @objc”一起使用即可。这导致此方法失败。
马特·比尔森

5

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

let audience = Audience.Public.toRaw()

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

struct Audience {
   static let Public  = "Public"
   static let Friends = "Friends"
   static let Private = "Private"
}

然后你的代码:

let audience = Audience.Public

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


看起来很整洁。我想知道在这种情况下最好的做法是什么。由于简单,我宁愿使用struct语法,但使用struct而不是enum似乎并不正确,或者也许只是我吗?嗯,没有什么可以阻止您在其他任何地方声明常量变量,这一次您只是将其添加到结构中以使其井井有条。有什么想法吗?
schystz

确切地讲,它可以作为常量变量工作,但是更有条理。正如我之前所说,唯一的问题是“开关盒”和快捷方式“ .Private”。如果您是从头开始构建应用程序,请尝试使用“枚举”,仅在“枚举”由于某些原因不满足您的代码时才使用结构。我个人避免使用常量变量,而总是使用结构。
阿德里亚诺·斯帕多尼 Adriano Spadoni)2015年

我用它作为默认键。我没有记住应用程序中的默认键,而是将键转储到结构中并从中拉出它们。
阿德里安

3

有多种方法可以做到这一点。您可以在枚举中定义一个函数,该函数根据枚举类型的值返回字符串:

enum Audience{
    ...
func toString()->String{
  var a:String

  switch self{
   case .Public:
    a="Public"
   case .Friends:
    a="Friends"
   ...
 }
 return a
}

或者,您可以尝试以下操作:

enum Audience:String{
   case Public="Public"
   case Friends="Friends"
   case Private="Private"
}

并使用它:

var a:Audience=Audience.Public
println(a.toRaw())

1

从Swift 3.0开始,您可以

var str = String(describing: Audience.friends)

1
令人难以置信,但这完全可以工作。比“惯用的”方法要短得多。谢谢!
罗马
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.