Как получить rawValue перечисления с помощью этой подфункции? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть перечисление, которое определено, как показано ниже.

enum PurchaseTimeType: Int,CaseIterable {
    case ASAP, ThisMonth, NextMonth
    func id() -> Int {
        switch self {
        case .ASAP:
            return 1
        case .ThisMonth:
            return 2
        case .NextMonth:
            return 3
        }
    }
    func title() -> String {
        switch self {
        case .ASAP:
            return "ASAP"
        case .ThisMonth:
            return "This Month"
        case .NextMonth:
            return "Next Month"
        }
    }
}

У меня есть id, хранящееся в одной переменной:

var id = 1

Как я могу получить title() длячто id?

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

Вы можете использовать, как показано ниже

class PurchaseTime {

    var id: Int!
    var title: String!
    init(id: Int, title: String) {

        self.id = id
        self.title = title
    }
}

enum PurchaseTimeType: Int,CaseIterable {
    case ASAP, ThisMonth, NextMonth

    var instance: PurchaseTime {

        switch self {

            case .ASAP:        return PurchaseTime(id: 1, title: "ASAP")
            case .ThisMonth:   return PurchaseTime(id: 2, title: "This Month")
            case .NextMonth:   return PurchaseTime(id: 3, title: "Next Month")
        }
    }
}

PurchaseTimeType.ASAP.instance.id
PurchaseTimeType.ASAP.instance.title


let id = 1
if let type = PurchaseTimeType.allCases.first(where: { $0.instance.id == id } ) {
    print(type.instance.title)
}

Я надеюсь, что его работа для вас

1 голос
/ 26 апреля 2019

Вы присваиваете свой Int идентификатор каждому случаю, например:

enum PurchaseTimeType: Int, CaseIterable {
    case asap = 1
    case thisMonth = 2
    case nextMonth = 3

    // All above cases can also be written in one line, like so
    // case asap = 1, thisMonth, nextMonth

    var id: Int {
        return self.rawValue
    }

    var title: String {
        switch self {
        case .asap:
            return "ASAP"
        case .thisMonth:
            return "This Month"
        case .nextMonth:
            return "Next Month"
        }
    }

}

Использование-1

let purchaseTime: PurchaseTimeType = .thisMonth

print(purchaseTime.id, ":", purchaseTime.title)

Использование-2: Фильтр по идентификатору

let id = 1
if let type = PurchaseTimeType.allCases.first(where: { $0.id == id } ) {
    print("Title for \(id) is \(type.title)")
}

Примечание Я обновил имена дел с UPPERCASE , чтобы следовать соглашению, каждый случай должен иметь имя lowerCamelCase с заглавной первой буквой и заглавной буквой для каждого последующего слова.

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

Вам необходимо добавить пользовательский init с идентификатором, подобным этому

enum PurchaseTimeType: Int,CaseIterable {
    case ASAP, ThisMonth, NextMonth
    func id() -> Int {
        switch self {
        case .ASAP:
            return 1
        case .ThisMonth:
            return 2
        case .NextMonth:
            return 3
        }
    }
    func title() -> String {
        switch self {
        case .ASAP:
            return "ASAP"
        case .ThisMonth:
            return "This Month"
        case .NextMonth:
            return "Next Month"
        }
    }
    init?(id: Int) {
        switch id {
        case 1:
            self = .ASAP
        case 2:
            self = .ThisMonth
        case 3:
            self = .NextMonth
        default:
            return nil
        }
    }
}

И вы можете инициировать экземпляр PurchaseTimeType с Int.Тогда вы можете получить его название следующим образом

let num = 1
if let purchaseTimeType = PurchaseTimeType(id:num) {
    print(purchaseTimeType.title())//ASAP
    print(purchaseTimeType.id())//1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...