You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift不自定义==函数,如何排除结构体部分属性参与Equatable判等?

Swift 结构体Equatable排除指定属性的低出错实现方案

方案1:Swift 5.9+ 官方@EquatableIgnored宏(无手动==实现,推荐)

这是目前最低成本的实现方式,仅需给不需要参与相等比较的属性添加@EquatableIgnored注解,编译器自动生成的Equatable判等逻辑会自动跳过该属性,完全不需要手写==函数。新增属性时默认会自动加入判等逻辑,不会出现漏写的问题。

注:@EquatableIgnored由SwiftUI框架提供,如果你开发的是不依赖SwiftUI的项目,可以使用下方的元组比较方案。

代码示例:

import SwiftUI

struct House: Equatable {
    var field_0: String
    var field_1: String
    // ... 其他需要参与判等的属性
    @EquatableIgnored var field_49: String // 该属性不会参与相等比较
    var field_50: String
}

方案2:全版本兼容方案:元组批量比较

如果使用的是Swift 5.9以下的版本,或者项目不依赖SwiftUI,可以将所有需要参与判等的属性打包为元组,利用Swift元组自动支持Equatable比较的特性完成判等,不需要手写大量if判断,仅需维护一次需要参与判等的属性列表即可,出错概率远低于逐个属性判断。

代码示例:

struct House: Equatable {
    var field_0: String
    var field_1: String
    // ... 其他属性
    var field_49: String
    var field_50: String

    static func == (lhs: House, rhs: House) -> Bool {
        return (
            lhs.field_0,
            lhs.field_1,
            // ... 其他需要参与判等的属性
            lhs.field_48,
            lhs.field_50
            // 不需要参与判等的field_49不加入元组即可
        ) == (
            rhs.field_0,
            rhs.field_1,
            // ... 对应右侧属性
            rhs.field_48,
            rhs.field_50
        )
    }
}

内容的提问来源于stack exchange,提问作者Cheok Yan Cheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:45:03