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

Swift中如何比较实现Comparable协议的自定义对象数组?

解决Swift中数组无法用Comparable元素直接比较的问题

要让两个[SomeClass]类型的数组支持<等比较运算符,你需要给Array扩展Comparable协议,并约束其元素类型遵循Comparable(你的SomeClass已经满足这个条件)。

实现扩展代码

extension Array: Comparable where Element: Comparable {
    public static func < (lhs: Array<Element>, rhs: Array<Element>) -> Bool {
        // 按字典序逐个对比元素
        for (leftItem, rightItem) in zip(lhs, rhs) {
            if leftItem < rightItem {
                return true
            } else if leftItem > rightItem {
                return false
            }
            // 元素相等则继续比较下一个
        }
        // 前面元素全相等时,较短数组更小
        return lhs.count < rhs.count
    }
    
    public static func == (lhs: Array<Element>, rhs: Array<Element>) -> Bool {
        // 复用数组默认的元素相等判断逻辑
        return lhs.elementsEqual(rhs)
    }
}

逻辑说明

这个扩展采用字典序比较逻辑,和字符串的比较规则一致:

  • 从第一个元素开始逐个对比,第一个不相等的元素的比较结果,就是两个数组的比较结果;
  • 如果所有对应位置的元素都相等,则长度更短的数组被认为更小。

测试示例

假设你的SomeClass实现如下:

class SomeClass: Comparable {
    let value: Int
    init(value: Int) {
        self.value = value
    }
    
    static func == (lhs: SomeClass, rhs: SomeClass) -> Bool {
        return lhs.value == rhs.value
    }
    
    static func < (lhs: SomeClass, rhs: SomeClass) -> Bool {
        return lhs.value < rhs.value
    }
}

现在就可以直接比较数组了:

let arr1 = [SomeClass(value: 1), SomeClass(value: 2)]
let arr2 = [SomeClass(value: 1), SomeClass(value: 3)]
print(arr1 < arr2) // 输出 true

let arr3 = [SomeClass(value: 1), SomeClass(value: 2), SomeClass(value: 3)]
print(arr1 < arr3) // 输出 true

内容的提问来源于stack exchange,提问作者Gargo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:02:02