Swift sorted by error: Cannot convert value of type 'CGFloat?' to expected argument type 'Self'

Swift sorted by error: Cannot convert value of type 'CGFloat?' to expected argument type 'Self'

这是自定义对象:

struct ScannedFacts {
    var result = -1
    var frame:CGRect? = nil
    var name = ""
}

这是我想要对以下类型的数组进行排序的函数:

func getSortedData(data:[(String, ScannedFacts)]) -> [(String, ScannedFacts)] {
    return data.sorted(by: {[=11=].1.frame?.minX < .1.frame?.minX})
}

这是我得到的错误,我真的无法理解:

Cannot convert value of type 'CGFloat?' to expected argument type 'Self'

我在这里错过了什么?

比较值时需要使用 CGFloat 而不是 CGFloat?:

为方便起见,您可以使用计算 属性:

struct ScannedFacts {
    var frame:CGRect? = nil

    var frameMinX: CGFloat {
        // assume we treat `nil` the same way as `0`
        frame?.minX ?? 0
    }
}
return data.sorted { [=11=].1.frameMinX < .1.frameMinX }

ScannedFact 中的 frame 属性 是可选的,因此您可能想在没有任何框架可用或框架 属性 时提供默认值是 nil。您不能对比较 nil 的两个对象进行排序,因此您需要解包或提供默认值,如下所示:

func getSortedData(data:[(String, ScannedFacts)]) -> [(String, ScannedFacts)] {
    return data.sorted(by: {[=10=].1.frame?.minX ?? 0 < .1.frame?.minX ?? 0 })
}