返回动态类型的枚举方法

2024-07-04

我有一个枚举,我想创建一个方法来为每种情况返回不同的类型。

例如,我有一本字典[String: Any]。为了处理这些值,我使用枚举来创建一个键数组:

enum Foo {
    case option1
    case option2

    func createKey() -> [String] {
        switch self {
        case .option1: return ["scenario1"]
        case .option2: return ["scenario2"]
        }
    }
}

获得这些值后,我需要将它们转换为正确的类型才能使用它们。现在我正在手动使用if-statements但如果我能以某种方式在枚举中创建一个方法来返回正确的类型,那么它会减少很多代码。我当前的代码:

let origin: [String: Any] = ["scenario2": "someText"]
let option: Foo = .option2

option.createKey().forEach {
    guard let rawValue = origin[$0] else { return }

    switch option {
    case .option1:
        guard let value = rawValue as? Int else { return }
        print("Value is an Int:", value)
    case .option2:
        guard let value = rawValue as? String else { return }
        print("Value is a String:", value)
    }
}

我想要实现的是:

option.createKey().forEach {
    guard let rawValue = origin[$0] as? option.getType() else { return }
}

这可能吗?


我认为这里问题的核心是 Swift 有严格的类型。这意味着类型必须在编译时已知。显然,这是合法的:

let s : Any = "howdy"
if let ss = s as? String {
    print(ss)
}

但这是不合法的:

let s : Any = "howdy"
let someType = String.self
if let ss = s as? someType { // *
    print(ss)
}

someType必须是一个type;它不能是隐藏其自身类型的变量。但这实际上正是您要求做的。

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

返回动态类型的枚举方法 的相关文章

随机推荐

  • HashSet 的初始容量

    对于我知道要插入 1000 个整数以防止需要任何内部重建的 HashSet 我应该使用什么初始容量 起初我认为我应该使用 1000 但阅读了采用initialCapacity 参数的构造函数的描述 它说Constructs a new em
  • Python单元测试(使用SQLAlchemy)不写入/更新数据库?

    我很困惑为什么我的 Python 单元测试在没有实际更新数据库的情况下运行得很好 我什至可以看到来自 SQLAlchemy 的 SQL 语句并逐步浏览新创建的用户对象的电子邮件 INFO sqlalchemy engine base Eng
  • 如何判断一个点是否在椭圆内

    我之前发布过类似的问题 我试图确定一个点是否位于椭圆内 基本上我生成一些二元正态数据并创建一个椭圆 这是我使用的代码 library MASS set seed 1234 x1 lt NULL x2 lt NULL k lt 1 Sigma
  • Ajax请求在滚动页面时加载内容

    我已经尝试和搜索但没有找到 如何更改我编写的以下方法以与 on 方法一起使用 Get old posts when scrolling down window scroll function if window scrollTop docu
  • 在已部署的 ASP.NET 网站项目上,我可以更新 .resx 文件而不重新编译吗?

    我正在将 ASP NET 应用程序部署到锁定的生产环境 将程序集 包括卫星资源程序集 推送到此环境具有与其关联的进程 但将非程序集复制到环境则没有 在 ASP NET 网站项目中 我可以更新 resx 文件而不重新编译吗 我想这取决于您的应
  • MySQL 查询所有列的 max()

    使用单个查询检索表中所有列的最大值的正确方法是什么 谢谢 澄清 相同的查询应该适用于任何表 即列名不应被硬编码到其中 SELECT max col1 as max col1 max col2 as max col2 FROM table
  • 如何使我的 .htaccess 文件允许 Safari 和其他浏览器打开 GZIP?

    我正在使用 htaccess 文件来允许我的页面调用 gzip 压缩的 JavaScript 文件 它在 ie8 和 ff3 中工作正常 但脚本未在 Safari 或 Chrome 中加载 这是我正在使用的 htaccess 文件
  • JavaFx - tableView 中的 String 和 FlowPane (行?)?

    我目前正在尝试实现以下内容 一个以 ObservableList 作为数据集的 TableView 有两列 每列包含字符串 玩家的姓名 这部分很简单 单击播放器 名称 后 应在所选播放器下方注入自定义 FlowPane 如果单击另一个玩家
  • 如何改变Java中数组的长度? [复制]

    这个问题在这里已经有答案了 所以我被分配了一个项目 其中有一个数组 当用户将元素放入该数组时一旦装满 它的长度必须加倍 We are 不允许使用ArrayList或任何内容集合接口 我想做的是创建一个新数组 一旦旧数组已满 然后将值复制到新
  • python3 file.readline EOF?

    我无法确定何时到达 python 中的文件末尾file readline fi open myfile txt r line fi readline if line EOF or something similar dosomething
  • 以多态类型作为函数参数的 std::function 的容器

    我想要 另一个 回调注册的东西 扩展公共基本事件类型的不同事件类型将触发关联的回调函数 这是最初的草案或想法 include
  • 动态改变股票行情间隔

    我想动态更改我的股票间隔 我写了一个例子来向您展示我是如何做的 我的用例不是 加速度计 但我希望它能给您一个想法 http play golang org p 6ANFnoE6pA http play golang org p 6ANFno
  • Wix 安装程序开始菜单快捷方式未出现

    我正在尝试使用 WiX v3 7 因为 VS2012 不再包括安装和部署项目 为 Windows 应用程序创建一个安装程序项目 以用于学习目的 Wix 工具集已集成到 VS 我正在创建一个新的 WiX 单一安装程序安装项目 安装程序始终编译
  • 如何在ionic 2中生成和显示QR码

    我找到了在 Angular 和 ionic 1 中生成条形码的文档 但我需要在 Ionic 2 项目中生成一个 尝试 JsBarcode 项目 有一个 Angular 1 的包装器 我使用了本期中的说明来让它在 Angular 2 上工作
  • 表的存储引擎不支持修复。 InnoDB 还是 MyISAM?

    修复数据库后 我收到以下错误 scode tracker ap visits note The storage engine for the table doesn t support repair scode tracker visit
  • 如何根据颜色和尺寸属性通过关联产品图像更改可配置的产品主图像?

    我正在使用具有尺寸和颜色属性的可配置产品 我想根据所选选项更改可配置产品视图上的主图像 例如 如果我选择红色 则具有红色属性值的关联产品的图像应在我选择该选项后立即显示在主图像上 我怎样才能做到这一点 谢谢 我已经为我正在努力解决的这个问题
  • 在 Emacs VM 中设置 Gmail

    使用 mutt 作为电子邮件客户端一段时间后 我想尝试 GNU Emacs 的 VM 包 如果重要的话 Ubuntu 11 04 64 位 来阅读我的邮件 如果有可用的配置文件 emacs 和新的 vm 文件中必要的修改 我会在网络上进行
  • 复选框值未插入 mysql 中

    我正在尝试将复选框值插入我的 mysql 数据库 程序中没有错误 但我无法将值存入数据库 在数据库中它显示为空 public class MainActivity extends AppCompatActivity CheckBox box
  • 如何在完成另一个线程后运行一个线程

    我想运行两个线程r1 and r2 首先启动r1并完成后r1 start r2 仅在完成后r1 这怎么能做到呢 两个线程 一个接着一个 我的答案here https stackoverflow com questions 4592716 m
  • 返回动态类型的枚举方法

    我有一个枚举 我想创建一个方法来为每种情况返回不同的类型 例如 我有一本字典 String Any 为了处理这些值 我使用枚举来创建一个键数组 enum Foo case option1 case option2 func createKe