如何使用那里的子函数获取枚举的rawValue?

时间:2019-04-26 07:27:54

标签: ios swift enums

如下定义的枚举。

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。我将如何获得title中的id,什么是最好的方法?

为此寻求最佳的专业解决方案。

谢谢

3 个答案:

答案 0 :(得分:1)

您为每种情况分配Int ID,如下所示:

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 :按ID过滤

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

注意我从大写更新了案例名称,以遵循惯例,每个案例都应命名为 lowerCamelCase ,并使用小写的首字母和大写字母随后的每个单词。

答案 1 :(得分:1)

您可以按以下方式使用

int()

希望它对您有用

答案 2 :(得分:0)

您需要添加一个具有以下ID的自定义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
        }
    }
}

并且您可以使用Int初始化PurchaseTimeType实例。然后您可以按以下方式获得其标题

let num = 1
if let purchaseTimeType = PurchaseTimeType(id:num) {
    print(purchaseTimeType.title())//ASAP
    print(purchaseTimeType.id())//1
}