首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中是否存在Enum.GetName(Type, Object)方法的替代?

在Swift中是否存在Enum.GetName(Type, Object)方法的替代?
EN

Stack Overflow用户
提问于 2016-11-03 21:39:54
回答 2查看 496关注 0票数 0

在c#中,可以使用方法获取任何类型的枚举名称。

代码语言:javascript
复制
Enum.GetName (Type, Object)

在Swift中也可以这样做吗?

例如,我有一些枚举,它必须具有Int原始值,但也需要它自己的名称。如何在Swift 3中做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-03 22:27:38

先决条件:您有一个具有基础RawValue的枚举类型,即符合RawRepresentable的枚举。

C#方法Enum.GetName方法(类型, 对象)描述如下:

Enum.GetName Method (Type, Object) 公共静态字符串GetName( enumType类型,对象值) 参数 enumType

  • 类型:System.Type
  • 枚举类型。

value

  • 类型: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:)蓝图与Stringinit(describing:)初始化器结合起来。

代码语言:javascript
复制
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的回答中描述的Stringinit(describing:)初始化器。

票数 1
EN

Stack Overflow用户

发布于 2016-11-03 21:59:37

要将枚举大小写的名称作为String,可以在String上使用init(describing:)

代码语言:javascript
复制
enum Foo: Int {
    case A
    case B
    case C
}

let s = String(describing: Foo.A)
print(s) // "A"

你可以把这个放进烤箱:

代码语言:javascript
复制
enum Foo: Int {
    case A
    case B
    case C
    var asString: String { return String(describing: self) }
}

let s = Foo.A.asString
print(s) // "A"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40411688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档