鉴于以下枚举:
enum Audience {
case Public
case Friends
case Private
}
如何从下面的"Public"
常数中获取字符串audience
?
let audience = Audience.Public
答案 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"
答案 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)
答案 4 :(得分:21)
我喜欢将Printable
与Raw 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 中尝试和测试