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

Correct way to find leftmost position in an Array of CGPoints in Swift

根据 Correct way to find max in an Array in Swift,我试图使用 reduce 在 Swift 数组中找到最左边的位置。我本以为这会起作用:

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([=11=].x,.x)}

但是,我得到这个错误:

`Type 'CGPoint' does not conform to protocol 'Comparable'

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

想法?

数组包含 CGPoint,而在 reduce 闭包中,您试图 return 一个 CGFloat - 您必须将其转换为 CGPoint

var leftMost = a.reduce(CGPoint(x:CGFloat.greatestFiniteMagnitude,y:CGFloat.greatestFiniteMagnitude)) {
    CGPoint(x: min([=10=].x,.x), y: [=10=].y)
}.x

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

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

var leftMost = a.map { [=11=].x }.reduce(CGFloat.greatestFiniteMagnitude) { min([=11=],) }

可能更容易阅读,但在性能方面可能更昂贵。但正如@MartinR 所建议的,它也可以简化为:

var leftMost = a.reduce(CGFloat.greatestFiniteMagnitude) { min([=12=], .x) }

Swift 5 实施:

用法:

let leftMost = self.findPoint(points: points, position: .leftMost)

函数和枚举:

  enum Position {
    case topMost
    case bottomMost
    case leftMost
    case rightMost
  }
  func findPoint(points: [CGPoint], position: Position) -> CGPoint? {
    var result: CGPoint?
    switch (position) {
    case .bottomMost:
      result = points.max { a, b in a.y < b.y }
    case .topMost:
      result = points.max { a, b in a.y > b.y }
    case .leftMost:
      result = points.max { a, b in a.x > b.x }
    case .rightMost:
      result = points.max { a, b in a.x < b.x }
    }
    return result
  }