我可以将一个枚举限制为另一个枚举的某些情况吗?

2024-01-03

假设我有一家面包店和原料库存:

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

但随后我将不得不一遍又一遍地重新定义相同的成分,因为这两种蛋糕都使用了许多成分。我真的不想这样做 - 特别是因为枚举案例上附有库存编号rawValues.

这让我想到了一个问题: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


我认为你应该列出特定食谱的成分:

let chocolateCakeIngredients: [Ingredient] = [.flower, ...]

然后检查该列表是否包含所需的成分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将一个枚举限制为另一个枚举的某些情况吗? 的相关文章

随机推荐

  • 流畅的 NHibernate 映射

    我是 NHibernate 和 Fluent NHibernate 的新手 假设我有如下情况 Table Activities uniquidentier ID varchar ActivityName Table ActivityPara
  • 为什么 Azure 应用程序网关需要空子网

    当我尝试执行 New AzureRmApplicationGatewayIPConfiguration 来创建应用程序网关时 出现异常 Subnet xxx cannot be used for application gateway yy
  • 单元测试 Modelica 组件库?

    我正在 Modelica 中创建一个组件库 并且希望获得一些有关对包进行单元测试的技术的意见 到目前为止 我有一个测试包 由一组模型组成 每个组件一个模型 每个测试模型都会实例化一个组件 并将其连接到一些非常简单的帮助器类 这些类提供必要的
  • MVC 4:验证失败时返回引导模式内部的部分视图

    我正在使用 MVC 4 和 SimpleMembership 用于帐户处理 当用户登录网页时 我正在使用 Boostrap V3 2 0 模式 模态工作正常 甚至通过 Ajax BeginForm 处理 Modelstate 验证我遇到的问
  • 设计控制器导轨

    我在 ruby 1 8 7 上使用 Rails 3 并用于身份验证 设计 1 1 3 但这是我正在构建的一个相当大的社区网站 因此我有一个用于配置文件的表和一个用于用户的表 每次用户注册时 它也应该生成一个配置文件 但在设计中我不允许使用控
  • SCons 无法选择编译器(MinGW)[重复]

    这个问题在这里已经有答案了 我有一个简单的 SConstruct 文件 其中包含以下代码 path C MinGW bin env Environment ENV PATH path Program target myprogram sou
  • 在 Kivy 中显示 numpy/opencv/matplotlib 图像

    如何在 Kivy 中以标准 numpy opencv matplotlib 格式显示图像 Kivy 使用不同的图像内存布局 我不知道是哪一种 下面的代码完全可以正常工作 图像是使用 cv2 VideoCapture 捕获的 我认为图像是BG
  • Windows XP 上的 Vb6 http post 请求

    我在使用 VB6 发送 POST 请求时遇到问题 下面的代码在 Windows7 上运行正常 但在 Windows XP 上运行时没有任何运行时错误 并且发送数据包 但看起来没有在数据包中附加发布数据 我的代码是这样的 Set xmlhtt
  • 如何在 Windows 上设置 Python 2.6 的安装工具?

    有没有办法在 Windows 中安装 Setuptools for Python 2 6 而无需 exe 安装程序 目前还没有构建这个工具 Setuptools 的维护者表示 他可能需要一段时间才能实现它 有谁知道安装它的方法吗 第一个选项
  • 获取StorageFolder中的文件数量

    我正在使用 Windows Phone 8 1 RT 应用程序 我想知道如何获取StorageFolder 内的文件数量 我知道我们可以使用StorageFolder GetFilesAsync 然后检查返回的列表的计数 但由于此方法花费的
  • SSIS 配置连接字符串

    我的一些包裹遇到了问题 基本布局是连接字符串存储在数据库中的 SSIS 配置表中 我最近注意到 oledb 连接的服务器名称似乎保持静态 我看到过将包从一个环境移动到另一个环境时验证失败的情况 如果我将密码更改为第一个环境中使用的密码 它将
  • 获取一个返回两个整数的函数

    我正在编写一个函数 我希望它返回两个整数作为结果 但是 我无法让它做到这一点 有人可以帮助我吗 这是我最好的镜头 public static int calc int s int b int c int d int g if s g ret
  • 如何打印悬空指针以进行演示?

    我试图向某人解释为什么他们有一个悬空指针以及 free 实际上是如何工作的 指针是值 因此是按值传递的 但为此我认为我需要一种打印指针的方法t 不确定 就像这样printf p ptr memcpy 可以解决这个问题吗 char buf1
  • 警告消息:在文件中(文件,“rt”)[重复]

    这个问题在这里已经有答案了 我在尝试着将 CSV 文件导入到项目图表中 我在用着RMac OS X 上的 2 15 2 第一种方式尝试过 我尝试运行以导入 CSV 文件的脚本是这样的 group4 lt read csv XXXX csv
  • hbase 作为 Web 应用程序中的数据库

    关于在真实的 Web 应用程序中使用 hadoop 或相关技术的一个大问题 我只是想了解 Web 应用程序如何使用 hbase 作为其数据库 我的意思是 这是大数据应用程序所做的事情 还是他们使用普通数据库并仅使用这些技术进行分析 拥有一个
  • 从 C# 代码中访问 $(SolutionDir) 和 $(DevEnvDir) 等预构建宏的简单方法是什么?

    现在我正在考虑在预构建事件中写入文件的路径 然后在代码中读取该文件 但我想知道是否有更简单更优雅的方法 编辑 这是一种后续行动帮助一步构建所有项目 安装程序 NET WiX https stackoverflow com questions
  • 使用seaborn包关闭jointplot上的边际分布轴

    我喜欢这个特定的绘图以及将函数传递给 stat func 关键字以快速绘制和可视化变量之间关系的能力 但有一点 如何 关闭 或不绘制边际分布轴 它看起来不错 但有时我不想要这个功能 例如使用以下代码 import numpy as np i
  • 用于插入的 Guava 缓存侦听器

    我们会发现拥有一个非常有用AddListener补充RemovalListener在谷歌番石榴中 有没有合适的替代品AddListener这将补充RemovalListener 您可以自己提供 只需将您的自定义侦听器传递到您的计算即可Fun
  • TTimer.OnTimer 事件处理程序是可重入的吗?

    我的应用程序中有一个 TTimer 每 2 秒触发一次并调用我的事件处理程序 HandleTimerEvent HandleTimerEvent 函数会修改共享资源 并且在返回之前可能需要 10 秒的时间来执行 此外 我有时会在事件处理程序
  • 我可以将一个枚举限制为另一个枚举的某些情况吗?

    假设我有一家面包店和原料库存 enum Ingredient case flower 1 case sugar 2 case yeast 3 case eggs 4 case milk 5 case almonds 6 case choco