Int перечисления со строковым представлением - PullRequest
0 голосов
/ 04 апреля 2019

Я бы хотел иметь перечисление 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 ]

2 голосов
/ 04 апреля 2019

Я собрал это из связанных ответов, которые поддерживают все преобразования.

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 голос
/ 04 апреля 2019

Вы можете добавить его как вычисляемое свойство, например так:

enum Fruits: Int {
    case banana = 1
    case apple = 123

    var stringRepresentation: String {
        return "\(self)"
    }
}

Таким образом, вы можете использовать его вот так let favorite = Fruits.banana.stringRepresentation, и если вы хотите получить значение Int, вы простоcall .rawValue.

Если вы хотите получить значение enum из строки, я думаю, вам придется использовать что-то вроде init(from: ).

. Это потребует записи всехвозможные случаи, так что это не самый чистый код.Зависит от того, что вы пытаетесь выполнить, но, возможно, вам лучше использовать Словарь для этого.

0 голосов
/ 04 апреля 2019

Я не думаю, что есть способ сделать именно то, что вы хотите.Ниже приведен способ сделать что-то похожее, но, если у вас много дел, потребуется некоторое время, чтобы выписать их.

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...