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
接口并访问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"
}
}
}
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,替换Printable
为CustomStringConvertible
注意:使用CutomStringConvertible
允许Foo
采用不同的原始类型.例如enum Foo : Int, CustomStringConvertible { ... }
是可能的.这种自由可能很有用.
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)
当字符串用于原始值时,每个案例的隐含值是该案例名称的文本.
[...]
Run Code Online (Sandbox Code Playgroud)enum CompassPoint : String { case north, south, east, west }
在上面的示例中,CompassPoint.south具有隐含的原始值"south",依此类推.
您可以使用其rawValue属性访问枚举案例的原始值:
Run Code Online (Sandbox Code Playgroud)let sunsetDirection = CompassPoint.west.rawValue // sunsetDirection is "west"
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)
Sim*_*e99 24
我喜欢Printable
用Raw 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)
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)
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)
如果在 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)
小智 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 中尝试和测试
在尝试了几种不同的方法后,我发现如果您不想使用:
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。
对于阅读"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)
从 Swift 3.0 开始你可以
var str = String(describing: Audience.friends)
Run Code Online (Sandbox Code Playgroud)