繁体   English   中英

Swift - 如何从 ENUM 获取原始值

[英]Swift - How to get Raw Value from ENUM

我有以下枚举:

enum MembershipLevel: Int {
    
    case basic = 25
    case bronze = 50
    case silver = 100
    case gold = 500
    case platinum = 1000
    
}

然后我有以下 firebase 查找:

userRef.child(userId).child("memeberlevel").observeSingleEvent(of: .value, with: { (snapshot) in

    self.userRef.child(userId).child("count").observeSingleEvent(of: .value, with: { (snap) in
                
        if((snap.value!) < MembershipLevel.(snapshot.value!).rawValue) {
                    
            completion(false)
                    
        } else {

            completion(true)

        }
                
    })

})

由于以下代码,上面的代码会引发编译器错误:

MembershipLevel.(snapshot.value).rawValue

我如何动态引用枚举值,因为代码片段MembershipLevel.basic.rawValue完全可以?

你不应该在这里使用枚举。 不能动态引用枚举案例。

虽然你可以做这样的事情:

enum MembershipLevel: Int, CaseIterable {
    
    case basic = 25
    case bronze = 50
    case silver = 100
    case gold = 500
    case platinum = 1000
    
    init?(string: String) {
        if let value = MembershipLevel.allCases.first(where: { "\($0)" == string }) {
            self = value
        } else {
            return nil
        }
    }
}

// usage:
let userValue = snapValue.value as! Int
let membershipString = snapshot.value as! String
if userValue < MembershipLevel(string: membershipString)!.rawValue {
    
}

它将来可能会中断,因为我认为不能保证生成枚举案例名称的"\($0)"

我会使用字典:

let membershipLevelNameDict = [
    "basic": 25,
    "bronze": 50,
    "silver": 100,
    "gold": 500,
    "platinum": 1000
]

用法:

let userValue = snapValue.value as! Int
let membershipString = snapshot.value as! String
if userValue < membershipLevelNameDict[membershipString] ?? 0 {

}

使用此字典,您还可以创建枚举的实例:

membershipLevelNameDict[membershipString].flatMap(MembershipLevel.init(rawValue:))

但是,如果您想比较原始值,只需像在第一个片段中一样直接访问字典。

您可以使您的枚举符合 Comparable 协议并创建一个采用 Int 的初始化程序:

extension MembershipLevel: Comparable {
    init?(_ value: Any?) {
        switch value {
        case let int as Int:
            self.init(rawValue: int)
        case let string as String:
            switch string {
                case "basic": self = .basic
                case "bronze": self = .bronze
                case "silver": self = .silver
                case "gold": self = .gold
                case "platinum": self = .platinum
                default: return nil
            }
        default: return nil
        }
    }
    static func < (lhs: Self, rhs: Self) -> Bool {
        lhs.rawValue < rhs.rawValue
    }
}

现在您可以从快照值初始化枚举并直接比较它们

if let lhs = MembershipLevel(snap.value),
    let rhs = MembershipLevel(snapshot.value),
    lhs < rhs {      
        completion(false)             
    }
} else { 
    completion(true)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM