首页 > 解决方案 > Swift Enum:表达式模式匹配问题

问题描述

我一直在尝试将自定义关联值与枚举中的字符串混合,但无法这样做。当我尝试在枚举上应用 switch case 时,出现此错误:'Fruit' 类型的表达式模式无法匹配'Fruit' 类型的值

是因为字符串是值类型,因此 Swift 能够比较它们,但不能比较作为引用类型的 Fruit 的自定义类对象?

class Fruit{
    let name: String?
    let energyKcl: Double?
    let costPerKg: Double?

    init(name:String, energyKcl: Double, costPerKg: Double) {
        self.name = name
        self.energyKcl = energyKcl
        self.costPerKg = costPerKg
    }
}

enum Calorie {
    case fruit(Fruit)
    case chocolate (String)
    case dairy(String)
    case Nuts(String)
}


let banana = Fruit.init(name: "Banana", energyKcl: 100, costPerKg: 10)

func prepareBreakfast(calories: Calorie){
    switch calories {

    case .chocolate("Dark"):
        print("Dark")

    case .chocolate("White"):
        print("White")

    case .fruit(banana): //Error: Expression pattern of type 'Fruit' cannot match values of type 'Fruit'
        print("banana")

    default:
        print ("Not available")
    }
}

prepareBreakfast(calories: .fruit(banana))

标签: swiftenums

解决方案


没有问题,如果没有Equatable协议,自定义类是不可比的

extension Fruit: Equatable {

    static func == (lhs: Fruit, rhs: Fruit) -> Bool {
        return lhs.name == rhs.name
        && lhs.energyKcl == rhs.energyKcl
        && lhs.costPerKg == rhs.costPerKg
    }

}

推荐阅读