比较两个枚举变量,无论它们的关联值如何

2023-12-02

考虑这个枚举:

enum DataType {
    case One (data: Int)
    case Two (value: String)
}

Swift 具有模式匹配来将枚举与关联值进行比较,如下所示:

let var1 = DataType.One(data: 123)
let var2 = DataType.One(data: 456)

if case DataType.One(data: _) = var2 {
    print ("var2 is DataType.One")
}

如何不将一个变量与枚举类型进行比较,而是比较两个变量的枚举类型?我看到了很多类似的问题,但没有一个关注有两个变量的情况。

我基本上想要的是:

if case var1 = var2 {
    print ("var1 is the same enum type as var2")
}

更新的方法:

我认为对此没有原生支持。但是您可以通过定义自定义运算符来实现它(最好使用协议,但您也可以直接执行)。像这样的东西:

protocol EnumTypeEquatable {
    static func ~=(lhs: Self, rhs: Self) -> Bool
}

extension DataType: EnumTypeEquatable {
    static func ~=(lhs: DataType, rhs: DataType) -> Bool {
        switch (lhs, rhs) {
        case (.one, .one), 
             (.two, .two): 
            return true
        default: 
            return false
        }
    }
}

然后像这样使用它:

let isTypeEqual = DataType.One(value: 1) ~= DataType.One(value: 2)
print (isTypeEqual) // true



旧方法:

protocol EnumTypeEquatable {
    var enumCaseIdentifier: String { get }
}

extension DataType: EnumTypeEquatable {
    var enumCaseIdentifier: String {
        switch self {
        case .one: return "ONE"
        case .two: return "TWO"
        }
    }
}

func ~=<T>(lhs: T, rhs: T) -> Bool where T: EnumTypeEquatable {
    return lhs.enumCaseIdentifier == rhs.enumCaseIdentifier
}

旧版本取决于运行时,可能会默认提供enumCaseIdentifier实施取决于String(describing: self)这是不推荐的。 (自从String(describing: self)正在与CustromStringConvertible协议并且可以更改)

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

比较两个枚举变量,无论它们的关联值如何 的相关文章

随机推荐

  • Firefox 无法播放 HTML5 的 .webm 和 .ogv 视频

    我为我的网站准备了 3 种视频格式 assets video background purple ogg assets video background purple webm assets video background purple
  • chrome.runtime.getManifest() 未定义

    我正在尝试使用一些 javascript 来访问 Google Chrome 中的 chrome runtime 该脚本调用 chrome runtime getManifest 函数 但我的控制台显示该函数未定义 我已经阅读了有关此主题的
  • 如何计算一个数字的总位数?

    C 如何计算一个数字的总位数 例如 号码 887979789 有 9 位数字 如果不转换为字符串 您可以尝试 Math Floor Math Log10 n 1
  • phonegap:加载远程html

    我正在寻找一种加载远程 html 的方法phonegap安卓应用程序 我在用着super loadUrl file android asset www hello html 但是如何加载远程html页面呢 这是非常简单的Venkat 只需使
  • 检测以纵向或横向全屏播放的视频

    我为此投入了两天多的时间 我无法得到任何解决方案 我的要求是视频应该播放纵向内联 全屏 横向 我的问题是如何识别视频是全屏横向还是纵向播放 我已经实施了viewWillTransitionToSize方法 但AVPlayer有全屏箭头按钮
  • 将修改后的 SVG 绘制到画布上

    我想加载一个 SVG 图像 对其进行一些操作 contentDocument 然后将其绘制到画布上 将 SVG 绘制到画布上的一个很好的示例如下 http www phrogz net tmp canvas from svg html 但在
  • 如何构建 IOptions 进行测试?

    在 ASP NET Core 2 中 我有以下类IOptions
  • 如何编写比较对象的compareTo方法?

    我正在学习数组 基本上我有一个收集姓氏 名字和分数的数组 我需要写一个compareTo方法将比较姓氏 然后比较名字 以便列表可以从姓氏开始按字母顺序排序 然后如果两个人具有相同的姓氏 那么它将对名字进行排序 我很困惑 因为我书中的所有信息
  • Datetime.ToString 在 .NET6 中为月份缩写添加点

    我有这个简单的 C 代码示例 它为发票创建一个文件名 var x new DateTime 2022 8 26 var invoiceNumber 1100 var fileName CustomerX Invoice fileName i
  • Typo3 Extbase Repository->findAll() 返回空

    我就是不能找到所有 即使我能够通过以下方式访问特定记录 也会返回任何内容通过Uid查找 我已经注意到 并尝试解决方法 设置 打字稿解决方案和记录存储页面bug没有任何成功 我正在使用一个由扩展构建器创建的虚拟扩展代码为了您的方便 在 TYP
  • 如何用 C# 锁定文件?

    我不确定人们通常所说的 锁定 文件是什么意思 但我想要的是对一个文件执行此操作 当我尝试用另一个文件打开它时 该文件将产生 指定的文件正在使用 错误消息应用 我想这样做是为了测试我的应用程序 看看当我尝试打开处于此状态的文件时它的行为如何
  • SLF4J:类路径包含多个 SLF4J 绑定警告

    我在其他问题中看到 通常此警告的解决方案是将 slf4j 从导致此冲突的依赖项中排除 但我无法在我的项目中发现问题 SLF4J Class path contains multiple SLF4J bindings SLF4J Found
  • 使用 AJAX 更新后 Jquery 点击不起作用

    我已经阅读了一些关于我的问题的内容 但仍然没有得到正确的答案 我尝试了 on 方法 它仍然不起作用 我正在使用 Laravel foreach orders as order tr class td order menus name td
  • 如何清除徽章号码同时保留通知中心

    I use UIApplication sharedApplication setApplicationIconBadgeNumber 0 清除徽章号码 它工作正常 但远程通知同时被删除 还有许多其他问题需要清除通知中心 但我不想清除它们
  • SQL 查询澄清

    我有两张桌子医生和计费 我希望查看治疗多名患者的医生的姓名 医生编号和总费用 doctor表列如下 doctorid dname 计费表列如下 billid patientid doctorid fees 我尝试了以下代码 但出现错误 指出
  • 如何在 Android/Linux 上构建 OpenSSL ?

    你好 我需要为 Android NDK r5b 构建 OpenSSL 库 今天将是我的 useles 战斗的第二天 这是我所做的简短列表 下载 https github com fries android external openssl
  • 扩展 HashMap 并仅同步 put

    我最近在我们的代码库中遇到一个类 它扩展了 HashMap 并同步了 put 方法 除了比使用 ConcurrentHashMap 效率低之外 扩展 HashMap 并仅同步 put K V 可能会出现什么样的问题 假设我们不关心 get
  • 如何ajax jsf 2输出链接

    我想制作一个可以在ajax上运行的网页 一切ajax 我的意思是 每当您单击链接 我指的是 来使用另一个链接中的数据更改某个 div 时 例如
  • 如何使用 Jersey JSON POJO 支持?

    我有一个对象 我想将其作为 RESTful 资源以 JSON 形式提供 我像这样打开了 Jersey 的 JSON POJO 支持 在 web xml 中
  • 比较两个枚举变量,无论它们的关联值如何

    考虑这个枚举 enum DataType case One data Int case Two value String Swift 具有模式匹配来将枚举与关联值进行比较 如下所示 let var1 DataType One data 12