enum DocumentType : String
{
case
Any = "Any",
DL = "DL",
Passport = "Passport",
Invalid
}
我正在使用像这样的rawValue构造函数
if let d = DocumentType(rawValue: type) {
解析来自服务器的任何内容。
现在,假设服务器端的昏暗灯泡将DL更改为D1服务器端 - > 解析器将默认值中断为无效。
是否有windows-developer证明解析器的规定 没有手动写一个长的if else雏菊? 同样的问题与白痴在json中改变键的情况。 需要一些方法来以一种不那么好的开发人员的方式读出json。 感谢。
答案 0 :(得分:1)
我不认为你可以忽略大小写,但是如果没有if / else语句链,你可以创建一个初始化来防止你的特定问题:
enum DocumentType : String
{
case
Any = "Any",
DL = "DL",
Passport = "Passport",
Invalid
init?(raw:String) {
let str = raw.characters.count > 2 ? raw.capitalizedString : raw.uppercaseString
if let d = DocumentType(rawValue: str) {
self = d
}
else {
return nil
}
}
}
if let d = DocumentType(raw: "ANY") {
print("success!")
}
答案 1 :(得分:1)
适用于所有相关枚举的通用扩展。枚举必须遵守 String
和 CaseIterable
协议才能使其正常工作。
import Foundation
extension CaseIterable where Self:RawRepresentable, RawValue == String {
init?(rawValueIgnoreCase: RawValue) {
if let caseFound = Self.allCases.first(where: { $0.rawValue.caseInsensitiveCompare(rawValueIgnoreCase) == .orderedSame }) {
self = caseFound
} else {
self.init(rawValue: rawValueIgnoreCase)
}
}
}
enum FooBar: String, CaseIterable {
case foo
case bar = "BAR"
}
let foo = FooBar(rawValueIgnoreCase: "foo")
let FOO = FooBar(rawValueIgnoreCase: "FOO")
let FoO = FooBar(rawValueIgnoreCase: "FoO")
let bar = FooBar(rawValueIgnoreCase: "bar")
let Bar = FooBar(rawValueIgnoreCase: "Bar")
let BAR = FooBar(rawValueIgnoreCase: "BAR")
let oops = FooBar(rawValueIgnoreCase: "oops") // nil
答案 2 :(得分:0)
我们可以通过在初始化枚举时更改案例来实现此目的。
enum DocumentType : String {
case any = "ANY"
case dl = "DL"
case passport = "PASSPORT"
case invalid = "INVALID"
//If you want to display status in UI define your display name
var documentDisplayType: String {
switch self {
case .any:
return "Any"
case .dl:
return "Driving License"
case .passport:
return "Passport"
case invalid:
return "Not proper document"
}
}
虽然initaliziing使用uppercased()
函数将respose文档类型更改为大写。
let type = "Dl"
let docType = DocumentType(rawValue: type.uppercased())
print(docType.documentDisplayType) // Prints DL