鉴于以下枚举:
enum Audience {
case Public
case Friends
case Private
}
如何"Public"
从audience
下面的常量获取字符串?
let audience = Audience.Public
print("\(audience)")
String(describing: yourEnumValue)
鉴于以下枚举:
enum Audience {
case Public
case Friends
case Private
}
如何"Public"
从audience
下面的常量获取字符串?
let audience = Audience.Public
print("\(audience)")
String(describing: yourEnumValue)
Answers:
不确定此功能是在哪个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"
print("appState: \(application.applicationState)")
我得到的 appState: UIApplicationState
是类型,而不是枚举值的实际字符串表示形式。我在这里想念什么吗?(PS:对于rawValue,我只获得Int值...)
.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" */ }
OptionSet
您的意愿。最初的问题还是关于字符串。
“获取字符串”的惯用接口是使用该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,替换Printable
为CustomStringConvertible
注意:使用CustomStringConvertible
允许Foo
采用其他原始类型。例如enum Foo : Int, CustomStringConvertible { ... }
是可能的。这种自由可能是有用的。
CustomStringConvertible
,如果这个工程就像罚款没有它?
CustomStringConvertible
允许/要求您定义description
哪个变量,以便您决定为每个枚举大小写使用哪个字符串-这对于确保国际化以及代码的可读性非常重要。如果您不关心这些,则可以使用'enum Foo:String {/ * ... * /}`
现在,我将枚举重新定义为:
enum Audience: String {
case Public = "Public"
case Friends = "Friends"
case Private = "Private"
}
这样我就可以:
audience.toRaw() // "Public"
但是,这个新的枚举定义不是多余的吗?我可以保留初始枚举定义并执行以下操作:
audience.toString() // "Public"
= String
因为如果您不提供答案,它将自动获得原始值(案例名称)。
在Swift 3中,您可以使用此
var enumValue = Customer.Physics
var str = String(describing: enumValue)
enum
不是基于String
s
"\(enumValue)"
做同样的事情。^^
我喜欢用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"
Audience(rawValue: "Friends")
已针对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!"
CustomStringConvertible
实际上将允许使用print(r)
。
在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"
如果在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
对于阅读了“ 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)
}
}
}
在尝试了几种不同的方式后,我发现如果您不想使用:
let audience = Audience.Public.toRaw()
您仍然可以使用结构对其进行存档
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())
从Swift 3.0开始,您可以
var str = String(describing: Audience.friends)