ios - 从 CGPoints 数组中获取最大值和最小值

标签 ios arrays swift cgpoint

我们有一组 CGPoints:

let points = [(1234.0, 1053.0), (1241.0, 1111.0), (1152.0, 1043.0)]

我想要做的是获取数组中具有最高 x 值和最高 y 值的 CGPoint。我将使用这些点来创建 CGRect:

extension CGRect {
    init(p1: CGPoint, p2: CGPoint) {
        self.init(x: min(p1.x, p2.x),
                  y: min(p1.y, p2.y),
                  width: abs(p1.x - p2.x),
                  height: abs(p1.y - p2.y))
    }
}

我知道有一种方法可以通过执行以下操作来获取数组中的最大值和最小值:

points.min()
points.max()

但是这些似乎不起作用,因为它是一个 CGPoints 数组。是否可以从数组中获取这些值?

最佳答案

您可以映射值以找到 x 和 y 坐标中的最小值和最大值,如下所示。如果您不确定 points 数组是否包含任何数据,请使用 guard 语句来避免强制展开:

let xArray = points.map(\.x)
let yArray = points.map(\.y)
guard let minX = xArray.min(),
      let maxX = xArray.max(),
      let minY = yArray.min(),
      let maxY = yArray.max() else { return }

从那里开始:

let minPoint = CGPoint(x: minX, y: minY)
let maxPoint = CGPoint(x: minY, y: minY)

然后你可以修改你的扩展函数,因为你已经知道哪些值是最小值和最大值:

extension CGRect {
    init(minPoint: CGPoint, maxPoint: CGPoint) {
        self.init(x: minPoint.x,
                  y: minPoint.y,
                  width: maxPoint.x - minPoint.x,
                  height: maxPoint.y - minPoint.y)
    }
}

正如 Leo Dabus 在下面的评论中所建议的那样,您可以在可失败初始化程序扩展中一次性完成所有操作:

extension CGRect {
    init?(points: [CGPoint]) {
        let xArray = points.map(\.x)
        let yArray = points.map(\.y)
        if  let minX = xArray.min(),
            let maxX = xArray.max(),
            let minY = yArray.min(),
            let maxY = yArray.max() {

            self.init(x: minX,
                      y: minY,
                      width: maxX - minX,
                      height: maxY - minY)
        } else {
            return nil
        }
    }
}

关于ios - 从 CGPoints 数组中获取最大值和最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61843897/

相关文章:

javascript - UIWebview 中的自动凭据输入 - iOS

javascript - 在将数组推送到数组并像对象一样分配键值对之后,数组的长度是多少

swift - 如何使单元格具有渐变背景?

swift - 您可以在 SwiftUI 中直接将 Publisher 用作 @ObjectBinding 属性吗?

ios - 核心数据错误代码=134030 "An error occurred while saving"没有用户信息

ios - RESTful UIButton 操作的用户体验

iphone - 使用 UIRefreshControl

ios - 如何使用 Firebase 进行多次观察?

php - 如何以正确的格式序列化和反序列化数组

javascript - 如何从矩阵中删除第一个和最后一个括号?