gpt4 book ai didi

swift - 你能从它的案例名称中初始化一个枚举值吗(*不是*它的 RawValue?)

转载 作者:行者123 更新时间:2023-11-28 15:10:07 25 4
gpt4 key购买 nike

考虑这个枚举(注意它的类型是Int)

enum MyTestEnum : Int{
case one = 1
case eight = 8
case unknown = -1
}

你可以很容易地根据原始值初始化一个版本,就像这样......

let value = MyTestEnum(rawValue:-1)

我试图找出它是否可以用案例名称本身的字符串表示形式初始化(​​同样,不是原始值,而是“案例”之后的词),就像这样...

let value = MyTestEnum(caseName:"eight")

注意:如果可能,我希望它能与任何 枚举一起使用,无论其原始值类型如何。比如这个……

enum MyOtherEnum{
case xxx
case yyy
case zzz
}

let value = MyOtherEnum(caseName:"xxx")

那么这可以做到吗?

想法:

  • 我认为 Swift 有一种方法可以在给定一个表示完全限定类名的字符串的情况下实例化一个类。也许可以在这里使用类似的东西。

最佳答案

在 Swift 4.2 中,现在使用 CaseIterable 可以很容易地做到这一点。

enum MyOtherEnum: CaseIterable {
case xxx
case yyy
case zzz

init?(caseName: String) {
for value in MyOtherEnum.allCases where "\(value)" == caseName {
self = value
return
}

return nil
}
}

enum MyTestEnum: Int, CaseIterable{
case one = 1
case eight = 8
case unknown = -1

init?(caseName: String) {
for value in MyTestEnum.allCases where "\(value)" == caseName {
self = value
return
}

return nil
}
}

我在这里做的是创建一个可失败的初始化程序,它遍历所有可能的案例,测试 "\(value)"(它返回该潜在案例的名称)是否与 caseName 参数传递给初始值设定项。

当找到匹配时,self 被设置并且循环结束。否则,调用返回 nil

下面是两个有效和两个失败的例子:

let myOtherEnum = MyOtherEnum(caseName:"xxx")
print(myOtherEnum) // MyOtherEnum.xxx

let myTestEnum = MyTestEnum(caseName:"eight")
print(myTestEnum?.rawValue) // 8

let myOtherEnumFail = MyOtherEnum(caseName:"aaa")
print(myOtherEnumFail) // nil

let myTestEnumFail = MyTestEnum(caseName:"ten")
print(myTestEnumFail) // nil

关于swift - 你能从它的案例名称中初始化一个枚举值吗(*不是*它的 RawValue?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47804496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com