这是我的代码:
enum Pet {
case dog(Int), cat(String)
}
protocol PetHolder {
associatedtype Food
func determineFood(from: Pet) -> Food?
}
struct DogHolder: PetHolder {
typealias Food = Int
func determineFood(from: Pet) -> Int? {
// Possible one liner? Enum extension?
switch from {
case .dog(let food):
return food
default:
return nil
}
}
}
在实际代码中,Pet
是一个生成的巨大枚举。我们有很多类似DogHolder的类,它们应基于Pet
中案例的关联类型提取数据。
为每个XHolder
编写以下内容(如上所示)是不可维护的:
// Possible one liner? Enum extension?
switch from {
case .dog(let food):
return food
default:
return nil
}
}
这将导致一行行,其中仅case .dog(let food):
会有所不同。
我想查看它是否包含特定情况,并返回该枚举的唯一一种关联类型,该类型与它正在实现的协议的关联类型完全相同。枚举Pet始终具有一个关联值(再次与对象所实现的协议完全相同)。
编辑:
我现在知道了,但是如果可以并插入可能的nil值,我可以删除else吗?
if case let Pet.dog(food) = from {
return food
} else {
return nil
}