我一直在尝试将自定义关联值与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))
答案 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):
你很好。我认为您的代码没有其他问题。在我的末端,它工作得很好。