我有以下枚举:
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:))
但是,如果您想比较原始值,则像第一个代码片段一样直接访问字典。
关于ios - Swift-如何从ENUM中获得原始值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62725031/