假设我有一家面包店和原料库存:
enum Ingredient {
case flower = 1
case sugar = 2
case yeast = 3
case eggs = 4
case milk = 5
case almonds = 6
case chocolate = 7
case salt = 8
}
一个案例的rawValue
代表库存数量。
然后我有两个食谱:
巧克力蛋糕:
- 500克花
- 300克糖
- 3 eggs
- 200毫升牛奶
- 200克巧克力
杏仁蛋糕:
- 300克花
- 200克糖
- 20克酵母
- 200克杏仁
- 5 eggs
- 2g salt
现在我定义一个函数
func bake(with ingredients: [Ingredient]) -> Cake
我当然信任我的员工,但我仍然想确保他们只使用正确的原料来烘烤蛋糕。 ????
我可以通过定义两个单独的枚举来做到这一点,如下所示:
enum ChocolateCakeIngredient {
case flower
case sugar
case eggs
case milk
case chocolate
}
enum AlmondCakeIngredient {
case flower
case sugar
case yeast
case eggs
case almonds
case salt
}
然后烤一个这样的蛋糕:
// in chocolate cake class / struct:
func bake(with ingredients: [ChocolateCakeIngredient]) -> ChocolateCake
// in almond cake class / struct:
func bake(with ingredients: [AlmondCakeIngredient]) -> AlmondCake
但随后我将不得不一遍又一遍地重新定义相同的成分,因为这两种蛋糕都使用了许多成分。我真的不想这样做 - 特别是因为枚举案例上附有库存编号rawValue
s.
这让我想到了一个问题:Swift 是否有办法将一个枚举限制为另一个枚举的某些情况?类似于(伪代码):
enum ChocolateCakeIngredient: Ingredient {
allowedCases:
case flower
case sugar
case eggs
case milk
case chocolate
}
enum AlmondCakeIngredient: Ingredient {
allowedCases:
case flower
case sugar
case yeast
case eggs
case almonds
case salt
}
这样的组合可以吗?我该怎么做?
或者也许我可以在这种情况下使用另一种模式?
Update
从这个问题的所有评论和答案中,我认为我为这个问题选择的例子有点不合适,因为它没有概括问题的本质,并留下了关于类型安全的漏洞。
由于本页上的所有帖子都与这个特定示例相关,因此我在 Stackoverflow 上创建了一个新问题,并使用了一个更容易理解且切中要害的示例:
➡️ 同样的问题,还有更具体的例子 https://stackoverflow.com/q/40654823/2062785