如果我有一个原始整型值的枚举:
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
当前回答
Swift现在有所谓的隐式分配原始值。基本上,如果您不为每个case提供原始值,并且枚举类型为String,则它推断出case的原始值本身为字符串格式。去试试吧。
enum City: String {
case Melbourne, Chelyabinsk, Bursa
}
let city = City.Melbourne.rawValue
// city is "Melbourne"
其他回答
目前在枚举情况下没有自省。你必须手动声明它们:
enum City: String, CustomStringConvertible {
case Melbourne = "Melbourne"
case Chelyabinsk = "Chelyabinsk"
case Bursa = "Bursa"
var description: String {
get {
return self.rawValue
}
}
}
如果你需要原始类型是Int,你必须自己做一个切换:
enum City: Int, CustomStringConvertible {
case Melbourne = 1, Chelyabinsk, Bursa
var description: String {
get {
switch self {
case .Melbourne:
return "Melbourne"
case .Chelyabinsk:
return "Chelyabinsk"
case .Bursa:
return "Bursa"
}
}
}
}
迅速:
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
这太令人失望了。
当你需要这些名字的时候(编译器完全知道这些名字的准确拼写,但拒绝访问)——谢谢Swift团队!!——)但不想或不能让String作为枚举的基,一个冗长、麻烦的替代方法如下:
enum ViewType : Int, Printable {
case Title
case Buttons
case View
static let all = [Title, Buttons, View]
static let strings = ["Title", "Buttons", "View"]
func string() -> String {
return ViewType.strings[self.rawValue]
}
var description:String {
get {
return string()
}
}
}
您可以使用上述如下:
let elementType = ViewType.Title
let column = Column.Collections
let row = 0
println("fetching element \(elementType), column: \(column.string()), row: \(row)")
您将得到预期的结果(列的代码类似,但没有显示)
fetching element Title, column: Collections, row: 0
在上面,我已经使description属性引用回string方法,但这是一个品味问题。还要注意,所谓的静态变量需要通过其封闭类型的名称来限定作用域,因为编译器太健忘了,无法自行召回上下文…
斯威夫特团队必须得到真正的指挥。他们创建了枚举,你不能枚举,你可以使用枚举是“序列”,但不是enum!
String(description:)初始化式可以用来返回case标签名称,即使是对于非String rawValues的枚举:
enum Numbers: Int {
case one = 1
case two = 2
}
let one = String(describing: Numbers.one) // "one"
let two = String(describing: Numbers.two) // "two"
注意,如果枚举使用了@objc修饰符,这将不起作用:
在Swift中获取Objective-C @objc enum值的字符串名称? 为什么Enum返回“EnumName”而不是“caseLabel”的字符串(描述:)?
为Objective-C类型生成的Swift接口有时不包括@objc修饰符。这些枚举是在Objective-C中定义的,因此不像上面那样工作。
我遇到了这个问题,想分享一个创建magicFunction的简单方法
enum City: Int {
case Melbourne = 1, Chelyabinsk, Bursa
func magicFunction() -> String {
return "\(self)"
}
}
let city = City.Melbourne
city.magicFunction() //prints Melbourne