将枚举值转换为字符串?

给定以下枚举:

enum Audience {
case Public
case Friends
case Private
}

如何从下面的 audience常量获得字符串 "Public"

let audience = Audience.Public
163048 次浏览

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

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

这样我就可以:

audience.toRaw() // "Public"

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

audience.toString() // "Public"

“获取 String”的惯用接口是使用 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

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

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

let audience = Audience.Public.toRaw()

您仍然可以使用 struct 对其进行归档

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

然后你的代码:

let audience = Audience.Public

会如预期般奏效。它不漂亮,有一些缺点,因为你不使用“枚举”,你不能使用快捷方式只添加。Private 也不能处理交换案件。

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

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

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

更新为 Xcode 7 GM 的发布。它的工作原理和人们现在所希望的一样——感谢苹果!

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

不确定在哪个 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"

来源。

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

对于任何阅读“快速编程语言”“快速旅行”章节中的例子并寻找简化 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)
}
}
}

在《迅速3》里,你可以用这个

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

快速使用枚举获取字符串值

在 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

从 Swift 3.0开始

var str = String(describing: Audience.friends)

用 Ruby 的方式

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

还有一条路

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

如果需要使用静态字符串作为枚举值,友好地使用向导:

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

我同意以上所有的答案,但在您的枚举私有和公共情况下不能定义,因为这些是默认的关键字。我把 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 }
}

}

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

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


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

在 Swift 5中测试过

现代,简约的方式

enum Audience: String {
case public = "Public"
case friends = "Friends"
case private = "Private"


func callAsFunction() -> String {
self.rawValue
}
}


let audience = Audience.public() // "Public"

XCode 14.0.1/Swift 5.7:

这应该是一件很容易实现的事情,但是这很令人困惑,还有一些陷阱!

这里的大多数答案都解释了如何为每个枚举值创建 合伙人字符串,或者如何创建显式 Strings的枚举,但是只有在创建自己的枚举时才有可能这样做。

对于已经存在的枚举,就像苹果 API 中的许多枚举一样,人们可能真的希望 改变信仰枚举值为 String

举一个具体的例子,如果想在 SwiftUI Text 视图中显示 NWConnection.States值。

根据一些答案,假设我们有这样的东西:

Class tcpClient() {
var connection: NWConnection
(...)

那么

Text("Current state: \(tcpClient.connection.state)")

应该可以,但是你会得到一个“ 在调用实例方法‘阑尾插值’时没有精确匹配”错误。

解释这种行为的一个原因是,尽管在苹果的文档中被描述为 enum,但有些枚举实际上不是 斯威夫特枚举,而是 C 风格枚举。根据 Apple 的说法,Swift 不能打印文本版本,因为它在运行时只有 enum 的数值。对于某些 API 来说可能就是这种情况。 参见: < a href = “ https://stackoverflow. com/a/70910402/5965609”> https://stackoverflow.com/a/70910402/5965609

这里提出的另一个解决方案是:

Text(String(describing: tcpClient.connection.state))

似乎有效,但@Eric Aya 评论说: String(describing:)应该 < strong > never 用于将任何东西转换成 String,这不是它的用途,在许多情况下会产生意想不到的结果。更好地使用字符串插值或字符串初始值设定项。

因此,对于来自 API 或其他导入代码的 C 样式枚举,唯一可行的解决方案似乎是使用一个带有开关用例的函数将 Strings与每个 enum的值关联起来。