如何在Swift中获取枚举值的名称?
在Swift-3中,你可以在枚举中添加以下方法:
/**
* 枚举的名称(按照大小写写法)。
*/
var name: String {
get { return String(describing: self) }
}
/**
* 枚举的完整名称
* (枚举的名称加上点再加上按照大小写写法的名称)。
*/
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)
// 输出 "Melbourne"
print(city.description)
// 输出 "City.Melbourne"
如果你想为所有的枚举提供这个功能,你可以将它作为扩展:
/**
* 为所有枚举扩展一个简单的方法来获取它们的名称。
*/
extension RawRepresentable where RawValue: Any {
/**
* 枚举的名称(按照大小写写法)。
*/
var name: String {
get { return String(describing: self) }
}
/**
* 枚举的完整名称
* (枚举的名称加上点再加上按照大小写写法的名称)。
*/
var description: String {
get { return String(reflecting: self) }
}
}
这只适用于Swift枚举。
问题的原因是Swift中没有关于枚举值的内省(introspection)功能。解决方法是手动声明每个枚举值,并为其定义一个description属性来获取枚举值的名称。如果原始类型是Int,需要使用switch语句来实现。此外,还可以省略get { ... }部分来提高代码的简洁性,前提是不定义setter。还有一个问题是在Xcode 7.3中,Printable已被重命名为CustomStringConvertible,所以需要相应地更改代码。以下是整理后的文章:
在Swift中,目前没有关于枚举值的内省功能。因此,需要手动声明每个枚举值,并为其定义一个description属性来获取枚举值的名称。如果原始类型是Int,需要使用switch语句来实现。以下是示例代码:
enum City: String, CustomStringConvertible {
case Melbourne = "Melbourne"
case Chelyabinsk = "Chelyabinsk"
case Bursa = "Bursa"
var description: String {
return self.rawValue
}
}
enum City: Int, CustomStringConvertible {
case Melbourne = 1, Chelyabinsk, Bursa
var description: String {
switch self {
case .Melbourne:
return "Melbourne"
case .Chelyabinsk:
return "Chelyabinsk"
case .Bursa:
return "Bursa"
}
}
}
如果想要将原始类型设置为Int,需要使用switch语句来手动返回每个枚举值的名称。另外,可以省略get { ... }部分来提高代码的简洁性,前提是不定义setter。以下是示例代码:
enum City: Int, CustomStringConvertible {
case Melbourne = 1, Chelyabinsk, Bursa
var description: String {
switch self {
case .Melbourne:
return "Melbourne"
case .Chelyabinsk:
return "Chelyabinsk"
case .Bursa:
return "Bursa"
}
}
}
通过上述代码,可以手动获取枚举值的名称。如果原始类型是String,可以直接返回枚举值的rawValue属性;如果原始类型是Int,需要使用switch语句来手动返回每个枚举值的名称。
在Xcode 7.3中,Printable已被重命名为CustomStringConvertible。因此,需要相应地更改代码。在第一个示例代码中,将第一行改为`enum City : String, CustomStringConvertible`。作为CustomStringConvertible协议的一部分,需要将属性改为公共属性,例如`public var description : String`。
希望以上内容对你有所帮助。
问题的出现原因:在Swift语言中,我们希望能够获取枚举值的名称,但在过去的版本中并没有直接的方法来实现这一点。
解决方法:在Xcode 7 beta 5(Swift 2版本)中,引入了一种新的方法来获取枚举值的名称。我们可以使用`print(_:)`函数来打印枚举值,或者使用`String`的`init(_:)`初始化器或字符串插值语法来将其转换为字符串。
具体代码如下:
enum City: Int {
case Melbourne = 1, Chelyabinsk, Bursa
}
let city = City.Melbourne
print(city) // 打印 "Melbourne"
let cityName = "\(city)" // 或者 `let cityName = String(city)`
print(cityName) // 打印 "Melbourne"
通过这种方法,我们不再需要定义和维护一个切换每个枚举值并返回字符串文字的方便函数。而且,这种方法适用于任何枚举,即使没有指定原始值类型。
另外,我们还可以使用`debugPrint(_:)`和`String(reflecting:)`来获取完全限定的名称。
debugPrint(city) // 打印 "App.City.Melbourne"
let cityDebugName = String(reflecting: city)
print(cityDebugName) // 打印 "App.City.Melbourne"
需要注意的是,我们可以自定义每种情况下的打印结果。
extension City: CustomStringConvertible {
var description: String {
return "City \(rawValue)"
}
}
print(city) // 打印 "City 1"
extension City: CustomDebugStringConvertible {
var debugDescription: String {
return "City (rawValue: \(rawValue))"
}
}
debugPrint(city) // 打印 "City (rawValue: 1)"
通过以上代码,我们可以根据枚举类型的不同定制打印结果。
需要注意的是,以上方法仅适用于Swift枚举。对于绑定支持的C-based枚举(如NSLocaleLanguageDirection),这种方法不适用。但是,我们可以为此类类型添加一个符合CustomStringConvertible协议的扩展来实现类似的功能。
通过使用Swift的一些新特性和方法,我们现在可以更方便地获取枚举值的名称。这为我们在开发中处理枚举类型带来了更多便利。