有没有办法将“if case”语句编写为表达式?

2024-02-22

考虑这段代码:

enum Type {
    case Foo(Int)
    case Bar(Int)

    var isBar: Bool {
        if case .Bar = self {
            return true
        } else {
            return false
        }
    }
}

真恶心。我想写这样的东西:

enum Type {
    case Foo(Int)
    case Bar(Int)

    var isBar: Bool {
        return case .Bar = self
    }
}

但这样的构造在 Swift 中似乎不存在,或者我找不到它。

由于每个案例都有相关的数据,我认为不可能实现~=运算符(或任何其他帮助器)以与上述表达式等效的方式。无论如何,if case所有枚举的语句都是免费存在的,不需要手动实现。

因此我的问题是:有没有更简洁/声明/干净/惯用的方式来实现isBar比我上面有的?或者更直接的说,有什么办法可以表达if case 声明作为斯威夫特表达式?


更新2:另一种解决方法...创建一个var返回一个Int仅基于案例,然后使用静态(或实例,我认为静态看起来更干净)方法来测试案例的等效性。它不会与Equatable,您不必重载运算符(除非您想用一个运算符替换静态方法),并且您也不必创建单独的var isFoo, var isBar, etc.

我知道您使用这个示例来提出一个更通用的问题(我如何使用“if case”作为表达式?),但如果这是不可能的,这可能是一个有效的解决方法。如果这解决的是“症状”而不是“问题”,我深表歉意

enum Something{
    case Foo(Int)
    case Bar(Int)

    static func sameCase(a: Something, b: Something) -> Bool {
        return a.caseValue == b.caseValue
    }

    var caseValue: Int {
        switch self {
        case .Foo(_):
            return 0
        case .Bar(_):
            return 1
        }
    }

    //if necessary
    var isBar: Bool {
        return Something.sameCase(self, b: Something.Bar(0))
    }
}

Something.sameCase(.Bar(0), b: .Foo(0)) // false
Something.sameCase(.Bar(1), b: .Foo(2)) // false
Something.sameCase(.Foo(0), b: .Foo(0)) // true
Something.sameCase(.Bar(1), b: .Bar(2)) // true


Something.Bar(0).isBar // true
Something.Bar(5).isBar // true
Something.Foo(5).isBar // false

更新1:

好吧,这似乎可行。如果您重载 == 运算符以忽略值并仅在两个枚举相同时返回 true,则您可以在 isFoo 方法中传递任何值并仍然确定类型。

我假设您需要自定义此函数以适应关联的值,但这似乎是朝着正确方向迈出的一步

enum Something {
    case Foo(Int)
    case Bar(Int)

    var isFoo: Bool {
        return self == .Foo(0) // number doesn't matter here... see below
    }
}

func ==(a: Something, b: Something) -> Bool {
    switch (a,b) {
    case (.Bar(_), .Bar(_)):
        return true
    case (.Foo(_), .Foo(_)):
        return true
    default:
        return false

    }
}

let oneFoo = Something.Foo(1)
let twoFoo = Something.Foo(2)
let oneBar = Something.Bar(1)
let twoBar = Something.Bar(2)

oneFoo == twoFoo // true
oneFoo == oneFoo // true
oneFoo == oneBar // false
oneFoo == twoBar // false

OLD:

您可以使用selfcasename 直接检查它是哪种情况,你不必使用case关键词。希望这适合您的情况:

enum Something{
    case Foo(Int)
    case Bar(Int)

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

有没有办法将“if case”语句编写为表达式? 的相关文章

随机推荐

  • OpenCL - 将树复制到设备内存

    我用 C 代码实现了二叉搜索树 我的每个树节点如下所示 typedef struct treeNode int key struct treeNode right struct treeNode left treeNode t 宿主建造的树
  • NSCollectionView 取消多选

    所以我现在已经对这个主题进行了相当多的调查 但还没有发现任何与之相关的有用信息 我的问题是我创建了一个 NSCollectionView 它的作用类似于图像处理程序 因此您可以在其中放置图像 一次选择一个甚至多个图像 并根据需要删除它们 选
  • 如何在redshift中生成12位唯一编号?

    我的表中有 3 列 即email id rid final id 规则rid and final id If the email id有对应的rid use rid as the final id If the email id没有对应的r
  • for循环中多个异步函数之后的NodeJS回调

    我从 mongodb 获取一个文档 其中包含一个带有该文档注释的数组 评论中是撰写评论的用户的 id 我现在需要根据用户的 id 获取用户名 但遇到了几个问题 我有以下代码 显然 它不起作用 但我希望它能让您了解我想要完成的任务 MORE
  • 找不到类 PHP

    I used 这个推特库 https github com abraham twitteroauth并收到此错误 谁能告诉我哪里出错了 ERROR Fatal error Class Abraham TwitterOAuth Config
  • joomla中如何设置默认语言

    我使用 Joomla 1 5 24 Stable 使用 JoomFish 2 2 3 发布来翻译网站 在 joomfish 语言管理器的内容语言中 我有 3 种语言 en ru 和 ro 默认设置为 ro 激活就是全部 无论浏览器语言如何
  • 如何以编程方式打开 .net 2.0。它是否正确?

    我正在尝试以编程方式打开 安装 Net 2 0 Framework视窗功能 B c Windows 7 及更高版本不允许您手动安装 net 我的客户永远无法从控制面板启用该功能 Windows 7 包含 net 2 0 但 Windows
  • 在动作组合期间访问 Play Framework 路由参数

    我有一个操作想要应用于 Play 应用程序中的多个路线 这些路由对产品执行操作 并且产品可以有多个版本 我希望我的 API 能够正常工作 以便用户可以显式指定版本 通过查询参数 如果他们没有指定版本 我们将为他们从数据库中查找最新版本并对其
  • 最大连接池是否也限制数据库的最大连接数?

    我正在使用 hikari cp 和 spring boot 应用程序 该应用程序有超过 1000 个并发用户 我已经设置了最大池大小 spring datasource hikari maximum pool size 300 当我使用查看
  • 通过socket发送wav文件

    我正在尝试通过套接字发送 wav 文件 我收到错误 TypeError must be string or buffer not instance waveFile wave open WAVE OUTPUT FILENAME rb my
  • Umbraco 7 SEO 标签

    我想在 Umbraco 中创建 SEO 标签的网站 我想知道它是如何做到的 有没有最佳实践文件或建议 我不是 SEO 专家 但希望下面的代码片段可以帮助您入门 Metadata 在页面上我添加了一些属性 如果您按照文档类型 通过继承或通过组
  • 如何处理 Wicket 自定义模型中抛出的异常?

    我有一个带有自定义模型的组件 扩展 wicket 标准模型类 当 Wicket 调用时 我的模型从数据库 Web 服务加载数据getObject 此查找可能会因多种原因而失败 我想通过在带有该组件的网页上显示一条不错的消息来处理此错误 最好
  • 如何使用宏来收集变量名称?

    我想简化以下内容 class A int a int b int c std vector
  • 使用 React Hooks 出现“太多重新渲染”错误

    我在这里遇到了 React Hooks 的困扰 我在网上查找 但无法弄清楚如何使这些示例适应我的代码 我有以下组件会触发 太多重新渲染 错误 const EmailVerification gt const showMessage setS
  • symfony2:找不到AppKernel中包含的类

    我有这个app AppKernel
  • Mongo shell 无法连接到 Azure CosmosDB

    我无法在 Mac 下从 MongoDB Shell 连接到 Azure CosmosDB mongodb api mongo host XXX documents azure com port 10255 username XXX pass
  • 需要 Underscore.js 中 _.bindAll() 函数的解释

    我一直在学习一些backbone js并且我见过很多例子 bindAll 用来 我已经阅读了整个backbone js和underscore js文档页面 试图了解它的作用 但我仍然对它的作用非常模糊 这是下划线的解释 bindAll ob
  • docker swarm中容器之间的通信

    我想在 docker swarm 模式下通过 WebSocket 连接在主节点和工作节点之间进行通信 工作节点应该已到达主节点 连接失败 另外 我想通过 http 从我的主机连接到主节点 连接也失败 这是我的docker compose y
  • 一对多关系删除

    我有一对多的关系 class GameSystem Object dynamic var gameSystemName class games Object dynamic var gameSystemName gameSystemName
  • 有没有办法将“if case”语句编写为表达式?

    考虑这段代码 enum Type case Foo Int case Bar Int var isBar Bool if case Bar self return true else return false 真恶心 我想写这样的东西 en