如果我有一个原始整型值的枚举:
enum City: Int {
case Melbourne = 1, Chelyabinsk, Bursa
}
let city = City.Melbourne
如何将城市值转换为字符串墨尔本?这种类型名称内省在语言中可用吗?
类似于(这段代码将不起作用):
println("Your city is \(city.magicFunction)")
> Your city is Melbourne
如果我有一个原始整型值的枚举:
enum City: Int {
case Melbourne = 1, Chelyabinsk, Bursa
}
let city = City.Melbourne
如何将城市值转换为字符串墨尔本?这种类型名称内省在语言中可用吗?
类似于(这段代码将不起作用):
println("Your city is \(city.magicFunction)")
> Your city is Melbourne
当前回答
简单但有效…
enum ViewType : Int {
case Title
case Buttons
case View
}
func printEnumValue(enum: ViewType) {
switch enum {
case .Title: println("ViewType.Title")
case .Buttons: println("ViewType.Buttons")
case .View: println("ViewType.View")
}
}
其他回答
在Swift-3(用Xcode 8.1测试)中,你可以在你的枚举中添加以下方法:
/**
* The name of the enumeration (as written in case).
*/
var name: String {
get { return String(describing: self) }
}
/**
* The full name of the enumeration
* (the name of the enum plus dot plus the name as written in case).
*/
var description: String {
get { return String(reflecting: self) }
}
然后,您可以将其用作枚举实例上的常规方法调用。 它可能也适用于以前的Swift版本,但我还没有测试过。
在你的例子中:
enum City: Int {
case Melbourne = 1, Chelyabinsk, Bursa
var name: String {
get { return String(describing: self) }
}
var description: String {
get { return String(reflecting: self) }
}
}
let city = City.Melbourne
print(city.name)
// prints "Melbourne"
print(city.description)
// prints "City.Melbourne"
如果你想为你所有的枚举提供这个功能,你可以让它成为一个扩展:
/**
* Extend all enums with a simple method to derive their names.
*/
extension RawRepresentable where RawValue: Any {
/**
* The name of the enumeration (as written in case).
*/
var name: String {
get { return String(describing: self) }
}
/**
* The full name of the enumeration
* (the name of the enum plus dot plus the name as written in case).
*/
var description: String {
get { return String(reflecting: self) }
}
}
这只适用于Swift枚举。
我遇到了这个问题,想分享一个创建magicFunction的简单方法
enum City: Int {
case Melbourne = 1, Chelyabinsk, Bursa
func magicFunction() -> String {
return "\(self)"
}
}
let city = City.Melbourne
city.magicFunction() //prints Melbourne
在Swift 2.2中对枚举的String(…)(CustomStringConvertible)支持的基础上,对它们也有一些破碎的反射支持。对于有关联值的枚举案例,可以使用反射获得枚举案例的标签:
enum City {
case Melbourne(String)
case Chelyabinsk
case Bursa
var label:String? {
let mirror = Mirror(reflecting: self)
return mirror.children.first?.label
}
}
print(City.Melbourne("Foobar").label) // prints out "Melbourne"
然而,我的意思是,对于“简单”枚举,上面基于反射的标签计算属性只返回nil (boo-hoo)。
print(City.Chelyabinsk.label) // prints out nil
显然,在《Swift 3》之后,反思的情况应该会有所好转。现在的解决方案是String(…),正如在其他答案之一中建议的那样:
print(String(City.Chelyabinsk)) // prints out Cheylabinsk
Swift现在有所谓的隐式分配原始值。基本上,如果您不为每个case提供原始值,并且枚举类型为String,则它推断出case的原始值本身为字符串格式。去试试吧。
enum City: String {
case Melbourne, Chelyabinsk, Bursa
}
let city = City.Melbourne.rawValue
// city is "Melbourne"
迅速:
extension UIDeviceBatteryState: CustomStringConvertible {
public var description: String {
switch self {
case .unknown:
return "unknown"
case .unplugged:
return "unplugged"
case .charging:
return "charging"
case .full:
return "full"
}
}
}
如果你的变量是“batteryState”,那么调用:
self.batteryState.description