我想有一个Int枚举,它也可以“序列化”为Int或String。
enum Fruits : Int {
case Banana = 1
case Apple = 123
}
let favorite = Frutis(fromRaw: 1)
let banana = Fruits(from: "Banana")
assert(favorite==banana)
assert(favorite.rawValue == 1)
assert(String(describing: favorite) == "Banana")
在所有情况下,如果不自己执行init(fromRaw :)和init(from :)我怎么做?枚举包含许多条目,我想避免代码过大。
答案 0 :(得分:2)
我将这些答案与支持所有转换的链接答案放在一起。
enum Fruits : Int, CaseIterable {
case banana = 1
case apple = 123
init?<S: StringProtocol>(_ string: S) {
guard let value = Fruits.allCases.first(where: { "\($0)" == string }) else {
return nil
}
self = value
}
var stringRepresentation: String {
return "\(self)"
}
}
let favorite = Fruits(rawValue: 123)!
let apple = Fruits("apple")!
assert(favorite == apple)
assert(favorite.rawValue == 123)
assert(String(describing: favorite) == "apple")
答案 1 :(得分:1)
您可以将其添加为计算属性,如下所示:
enum Fruits: Int {
case banana = 1
case apple = 123
var stringRepresentation: String {
return "\(self)"
}
}
通过这种方式,您可以像let favorite = Fruits.banana.stringRepresentation
这样使用它,如果要获取Int值,则只需调用.rawValue
。
如果您想从字符串中获取枚举值,我认为您必须使用类似init(from: )
之类的东西。
这将需要写出所有可能的情况,因此它不是最干净的代码。取决于您要完成的工作,但也许最好为此使用Dictionary。
答案 2 :(得分:0)
我认为没有一种方法可以完全满足您的需求。我下面介绍的是一种类似的方法,但是如果您有很多案件,则需要一段时间才能写出来。
enum Fruits : Int {
case Banana = 1
case Apple = 123
var stringValue: String {
return "\(self)"
}
init?(stringValue: String) {
switch stringValue {
case "Banana":
self.init(rawValue: 1)
case "Apple":
self.init(rawValue: 123)
default:
self.init(rawValue: 0)
}
}
}
let favorite = Fruits(rawValue: 1)
let banana = Fruits(stringValue: "Banana")
assert(favorite==banana)
assert(favorite?.rawValue == 1)
assert(favorite?.stringValue == "Banana")