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
相关产品推荐
相关产品推荐

