鉴于以下枚举:
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不是基于Strings
"\(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)