在c#中,可以使用方法获取任何类型的枚举名称。
Enum.GetName (Type, Object)在Swift中也可以这样做吗?
例如,我有一些枚举,它必须具有Int原始值,但也需要它自己的名称。如何在Swift 3中做到这一点?
发布于 2016-11-03 22:27:38
先决条件:您有一个具有基础RawValue的枚举类型,即符合RawRepresentable的枚举。
C#方法Enum.GetName方法(类型, 对象)描述如下:
Enum.GetName Method (Type, Object)公共静态字符串GetName( enumType类型,对象值) 参数enumType
System.Typevalue
System.Object返回值-类型:System.String -包含enumType中值为value的枚举常量的名称的字符串;如果没有找到该常量,则返回null。
“转换”为Swift,该方法将enum类型作为第一个参数,将枚举的底层类型的值作为第二个参数;后者将(对于RawRepresentable一致性的先决条件)转换为Swift中枚举的RawValue类型的值。
最后,返回类型System.String (带有可能的null返回)将在Swift (String?)中转换为可选的String返回类型。
将这些观察结合在一起,您可以实现类似的getName方法(用于在运行时找到表示为YourEnum.RawValue实例的案例的String表示),方法是将在RawRepresentable中打印的init?(rawValue:)蓝图与String的init(describing:)初始化器结合起来。
func getName<T: RawRepresentable>(_ _: T.Type, rawValue: T.RawValue) -> String? {
if let enumCase = T(rawValue: rawValue) {
return String(describing: enumCase)
}
return nil
}
/* example setup */
enum Rank: Int {
case n2 = 2,n3,n4,n5,n6,n7,n8,n9,n10,J,Q,K,A
}
/* example usage */
let someRawValue = 7
if let caseName = getName(Rank.self, rawValue: someRawValue) {
print(caseName) // n7
}然而,这是人为的和强制的“翻译”,因为Swift enum:s与C#的不同(而且更强大)。通常,您将拥有枚举的实际实例(例如Rank.n7),而不是它的RawValue (例如7)的实例,在这种情况下,您可以直接使用@AlexanderMomchliov的回答中描述的String的init(describing:)初始化器。
发布于 2016-11-03 21:59:37
要将枚举大小写的名称作为String,可以在String上使用init(describing:)
enum Foo: Int {
case A
case B
case C
}
let s = String(describing: Foo.A)
print(s) // "A"你可以把这个放进烤箱:
enum Foo: Int {
case A
case B
case C
var asString: String { return String(describing: self) }
}
let s = Foo.A.asString
print(s) // "A"https://stackoverflow.com/questions/40411688
复制相似问题