Swift:将枚举值转换为String?

时间:2014-07-11 15:16:06

标签: string enums swift

鉴于以下枚举:

enum Audience {
    case Public
    case Friends
    case Private
}

如何从下面的"Public"常数中获取字符串audience

let audience = Audience.Public

17 个答案:

答案 0 :(得分:175)

获取字符串'的惯用界面是使用CustomStringConvertible接口并访问description getter。将您的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,将Printable替换为CustomStringConvertible

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

答案 1 :(得分:110)

不确定添加此功能的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的隐含原始值为   “南方”,等等。

     

使用rawValue访问枚举大小写的原始值   属性:

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

Source.

答案 2 :(得分:31)

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

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

所以我可以这样做:

audience.toRaw() // "Public"

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

audience.toString() // "Public"

答案 3 :(得分:22)

在swift 3中,你可以使用这个

var enumValue = Customer.Physics
var str = String(describing: enumValue)

来自Swift how to use enum to get string value

答案 4 :(得分:21)

我喜欢将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"

答案 5 :(得分: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!"

答案 6 :(得分:9)

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

答案 7 :(得分:5)

对于阅读“Swift编程语言”的“A Swift Tour”章节中的示例并寻找简化simpleDescription()方法的方法的人来说,通过执行String(self)将枚举本身转换为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)
        }
     }
   }

答案 8 :(得分:4)

如果在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

答案 9 :(得分: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())

答案 10 :(得分:3)

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

let audience = Audience.Public.toRaw()

您仍然可以使用结构

对其进行存档
struct Audience {
   static let Public  = "Public"
   static let Friends = "Friends"
   static let Private = "Private"
}

然后你的代码:

let audience = Audience.Public

将按预期工作。它不是很漂亮而且有一些缺点,因为你没有使用" enum",你不能只使用快捷方式添加.Private也不能用于切换案例。

答案 11 :(得分:2)

如果您需要使用静态字符串作为枚举值,指南很友好:

class EncyclopediaOfCats {
    struct Constants {
        static var playHideAndSeek: String { "Play hide-and-seek" }
        static var eat: String { "Eats" }
        static var sleep: String { "Sleep" }
        static var beCute: String { "Be cute" }
    }
}

enum CatLife {
    case playHideAndSeek
    case eat
    case sleep
    case beCute

    typealias RawValue = String
    
    var rawValue: String {
        switch self {
        case .playHideAndSeek:
            return EncyclopediaOfCats.Constants.playHideAndSeek
        case .eat:
            return EncyclopediaOfCats.Constants.eat
        case .sleep:
            return EncyclopediaOfCats.Constants.sleep
        case .beCute:
            return EncyclopediaOfCats.Constants.beCute
        }
    }
    
    init?(rawValue: CatLife.RawValue) {
        switch rawValue {
        case EncyclopediaOfCats.Constants.playHideAndSeek:
            self = .playHideAndSeek
        case EncyclopediaOfCats.Constants.eat:
            self = .eat
        case EncyclopediaOfCats.Constants.sleep:
            self = .sleep
        case EncyclopediaOfCats.Constants.beCute:
            self = .beCute
        default:
            self = .playHideAndSeek
        }
    }
}

答案 12 :(得分:1)

您可以从Swift 3.0开始

var str = String(describing: Audience.friends)

答案 13 :(得分:0)

使用Ruby方式

var public: String = "\(Audience.Public)"

答案 14 :(得分:0)

另一种方式

public enum HTTP{
case get
case put
case delete
case patch
var value: String? {
return String(describing: self)
}

答案 15 :(得分:0)

我同意上述所有答案,但在您的枚举中,无法定义 private 和 public 案例,因为它们是默认关键字。我在我的回答中包含了 CaseIterable,如果您需要循环,它可以帮助您获得所有案例。

enum Audience: String, CaseIterable {
case publicAudience
case friends
case privateAudience

var description: String {
    switch self {
    case .publicAudience: return "Public"
    case .friends: return "Friends"
    case .privateAudience: return "Private"
    }
}

static var allAudience: [String] {
    return Audience { $0.rawValue }
}

}

答案 16 :(得分:0)

您也可以使用 "\(enumVal)" 这是一个例子:

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

let dayOfWeek: String = "\(WeekDays.Mon)"

在 Swift 5 中尝试和测试