Swift2 枚举rawValue构造函数忽略大小写

Swift2 枚举rawValue构造函数忽略大小写,swift2,Swift2,我像这样使用rawValue构造函数 enum DocumentType : String { case Any = "Any", DL = "DL", Passport = "Passport", Invalid } 解析来自服务器的任何内容 现在,假设服务器端dim灯泡将DL更改为DL服务器端-> 解析器将默认值改为无效 是否有windows开发人员验证解析器的规定 缺少手动写入长if else daisy? 同样的问题是,傻瓜们改变了json中键的

我像这样使用rawValue构造函数

enum DocumentType : String
{
    case
    Any = "Any",
    DL = "DL",
    Passport = "Passport",
    Invalid
}
解析来自服务器的任何内容

现在,假设服务器端dim灯泡将DL更改为DL服务器端-> 解析器将默认值改为无效

是否有windows开发人员验证解析器的规定 缺少手动写入长if else daisy? 同样的问题是,傻瓜们改变了json中键的大小写。 需要以一种不太好的开发人员抵抗的方式读取json。
谢谢。

我不认为您可以忽略大小写,但您可以创建一个初始化器来防止您的特定问题,而无需一系列if/else语句:

if let d = DocumentType(rawValue: type) {

我们可以通过在初始化枚举时更改大小写来实现这一点

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!")
}
初始化时,使用
uppercased()
函数将响应文档类型更改为大写

 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"
    }
}

用于所有相关枚举的通用扩展。枚举必须遵守
String
caseitrable
协议才能工作

 let type = "Dl"
 let docType = DocumentType(rawValue: type.uppercased())
 print(docType.documentDisplayType) // Prints DL
今后,请坚持我们的原则。
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