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

Swift中如何按自定义条件查找数组的最小值?

自定义条件查找Swift数组最小值的问题

我定义了以下两个自定义类型,并基于它们创建了数组:

struct MyType {
    var id: String
    var value: Double
}

struct CustomObjectType {
    var size: CGFloat
    var myType: MyType
}

数组内容如下:

let collection: Array<CustomObjectType> = [CustomObjectType(size: 350.0, myType: MyType(id: "A", value: 0)),
                                           CustomObjectType(size: 200.0, myType: MyType(id: "B", value: 1)),
                                           CustomObjectType(size: 170.0, myType: MyType(id: "C", value: 2)),
                                           CustomObjectType(size: 200.0, myType: MyType(id: "D", value: 3)),
                                           CustomObjectType(size: 200.0, myType: MyType(id: "E", value: 4))]

我尝试按myType.value查找数组的最大和最小元素,但查找最小值的逻辑无法正常工作:

let maxElement = collection.max(by: { lhs, rhs in
    if (lhs.myType.value < rhs.myType.value) {
        return true
    }
    else {
        return false
    }
})

let minElement = collection.min(by: { lhs, rhs in
    if (lhs.myType.value > rhs.myType.value) {
        return true
    }
    else {
        return false
    }
})

print(maxElement?.myType.id, maxElement?.myType.value)
print(minElement?.myType.id, minElement?.myType.value)

运行结果:

Optional("E") Optional(4.0)
Optional("E") Optional(4.0)

minElement返回的是最大值对应的元素,而非最小值,请问该如何正确实现?


问题原因

Swift中min(by:)方法的闭包规则是:当左侧元素lhs应该被视为比右侧元素rhs更小时,返回true。你当前的闭包逻辑是lhs.myType.value > rhs.myType.value时返回true,这相当于告诉方法“左边元素比右边大的时候,左边排在前面”,最终min(by:)会选取排序后的最后一个元素,也就是最大值。

正确实现

只需要调整min(by:)的闭包逻辑,当lhs.myType.value小于rhs.myType.value时返回true即可:

let minElement = collection.min(by: { lhs, rhs in
    lhs.myType.value < rhs.myType.value
})

或者更简洁的写法:

let minElement = collection.min(by: { $0.myType.value < $1.myType.value })

运行后minElement会正确返回id: "A", value: 0的元素,打印结果为:

Optional("A") Optional(0.0)

另外,你的max(by:)代码也可以简化为:

let maxElement = collection.max(by: { $0.myType.value < $1.myType.value })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:18:25