具有String表示形式的Int枚举

时间:2019-04-04 15:39:03

标签: swift enums

我想有一个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 :)我怎么做?枚举包含许多条目,我想避免代码过大。

3 个答案:

答案 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")