Swift:将枚举值转换为string?
鉴于以下枚举:
enum Audience { case Public case Friends case Private }
如何从audience
常量下面得到string"Public"
?
let audience = Audience.Public
不知道在哪个Swift版本中添加了这个function,但是现在( Swift 2.1 )你只需要这个代码:
enum Audience: String { case Public case Friends case Private } let audience = Audience.Public.rawValue // "Public"
当string用于原始值时,每个案例的隐含值是该案例名称的文本 。
[…]
enum CompassPoint: String { case North, South, East, West }
在上面的例子中,CompassPoint.South有一个隐含的“南”的原始值,依此类推。
使用它的rawValue属性访问枚举大小写的原始值:
let sunsetDirection = CompassPoint.West.rawValue // sunsetDirection is "West"
资源。
“获取string”的惯用接口是使用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.description) String for 'foo' is Bing
更新 :对于Swift> = 2.0,用CustomStringConvertible
replacePrintable
现在,我将重新定义枚举为:
enum Audience: String { case Public = "Public" case Friends = "Friends" case Private = "Private" }
所以我可以这样做:
audience.toRaw() // "Public"
但是,这不是新的枚举定义是多余的吗? 我可以保留最初的枚举定义,并执行如下操作:
audience.toString() // "Public"
我喜欢使用Printable
with 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"
更新了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 3中,你可以使用这个
var enumValue = Customer.Physics var str = String(describing: enumValue)
从Swift如何使用枚举来获取string值
在Swift 2和最新的Xcode 7中(不需要指定枚举types或.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"
有多种方法可以做到这一点。 要么你可以在枚举中定义一个函数,该函数根据枚举types的值返回string:
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编程语言”“Swift编程语言”一章中的示例并寻找简化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) } } }
尝试几种不同的方法后,我发现如果你不想使用:
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中使用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