在Swift中找到CGPoints数组中最左边位置的正确方法

vy3*_*y32 0 reduce cgpoint swift

正确的方式绘制以在Swift中的Array中找到max,我试图在Swift数组中找到最左边的位置reduce.我原以为这会起作用:

var a = [CGPoint(x:1,y:1),CGPoint(x:2,y:2),CGPoint(x:0,y:0)]
var leftMost = a.reduce(CGPoint(x:CGFloat.max,y:CGFloat.max)) {min($0.x,$1.x)}
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

`Type 'CGPoint' does not conform to protocol 'Comparable'
Run Code Online (Sandbox Code Playgroud)

当然,我不是在比较一个CGPoint,我正在比较一点.x,那应该是一个CGFloat.

想法?

Ant*_*nio 6

数组成立CGPoint,而在reduce闭包中,你试图返回CGFloat- 你必须将它转换为CGPoint:

var leftMost = a.reduce(CGPoint(x:CGFloat.greatestFiniteMagnitude,y:CGFloat.greatestFiniteMagnitude)) {
    CGPoint(x: min($0.x,$1.x), y: $0.y)
}.x
Run Code Online (Sandbox Code Playgroud)

我知道,错误信息没有多大帮助:)

实现相同结果的另一种方法是首先将点转换为x坐标,然后减少:

var leftMost = a.map { $0.x }.reduce(CGFloat.greatestFiniteMagnitude) { min($0,$1) }
Run Code Online (Sandbox Code Playgroud)

也许更容易阅读,虽然在性能方面可能更昂贵.但正如@MartinR所暗示的那样,它也可以简化为:

var leftMost = a.reduce(CGFloat.greatestFiniteMagnitude) { min($0, $1.x) }
Run Code Online (Sandbox Code Playgroud)