为未知的枚举返回相同的原始值

问题描述

我想为未知的枚举返回相同的值,

我在代码中定义了以下枚举,

public enum Airport: String {
    case munich = "MUN_T01"
    case sanFrancisco = "SANF_T02"
    case singapore = "SP_T03"

   public var name: String {
        switch self {
        case .munich:
            return "Munich"
        case .sanFrancisco:
            return "San Francisco"
        case .singapore:
            return "Singapore"
   }
}

每当我调用上述枚举时,它都可以正常工作

var airportName = Airport(rawValue: "MUN_T01")
print("Airport Name: ",airportName)   // munich
print("Airport Code: ",airportName.rawValue)   // MUN_T01

现在,我想针对其他/未知场景(例如,

)进行介绍

var unkNownAirportName = Airport(rawValue: "Test_T01")

当我打印unkNown变量和

时,应打印otherunkNownAirportName

如果我打印unkNownAirportName.rawValue,它应该打印Test_T01

我能够获得其他/未知情况,但是我无法打印所传递的相同值(Test_T01)。有帮助吗?

解决方法

考虑用原始值替换枚举,用关联值替换枚举,然后可以进行已知和未知的案例,例如:

public enum Airport {
    case airport(name: String,code: String)
    case unknown(code: String)
    
    static let airports = [
        Self.airport(name: "Munich",code: "MUN_T01"),Self.airport(name: "San Francisco",code: "SANF_T02"),Self.airport(name: "Singapore",code: "SP_T03")
    ]
    
    var name: String {
        if case let .airport(name,_) = self {
            return name
        }
        return "Unknown"
    }
    
    var code: String {
        switch self {
            case let .airport(_,code):
                return code
            case let .unknown(code):
                return code
        }
    }
    
    static func airport(code: String) -> Airport {
        if let item = Self.airports.first(where: { $0.code == code }) {
            return item
        }
        return unknown(code: code)
    }
}

let airport = Airport.airport(code: "MUN_T01")
print("Airport:",airport.name,airport.code) // Airport: Munich MUN_T01

let airport2 = Airport.airport(code: "NONE")
print("Airport:",airport2.name,airport2.code) // Airport: Unknown NONE