Swift枚举:表达式模式匹配问题

时间:2019-05-21 15:17:44

标签: swift enums

我一直在尝试将自定义关联值与Enum中的String混合,但无法这样做。当我尝试在枚举上应用切换大小写时,出现以下错误:类型为“水果”的表达式模式无法匹配类型为“水果”的值

是因为字符串是值类型,因此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))

3 个答案:

答案 0 :(得分:2)

没有问题是,没有 Equatable 协议

,自定义类是不具有可比性的
extension Fruit: Equatable {

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

}

答案 1 :(得分:1)

模式匹配在内部使用Equatable,因此您应该更改Fruit类:

extension Fruit: Equatable {
    static func == (lhs: Fruit, rhs: Fruit) -> Bool {
        return lhs.name == rhs.name // or every field if you want
    }
}

如果要使用引用,只需将==函数更改为两个引用相等时返回true,但是我认为这不是一个好主意:

static func == (lhs: Fruit, rhs: Fruit) -> Bool {
    return lhs === rhs
}

答案 2 :(得分:0)

在您的代码中,

prepareBreakfast(calories:)方法替换下面的行,

case .fruit(banana):

使用

case .fruit(let banana):

你很好。我认为您的代码没有其他问题。在我的末端,它工作得很好。