在此过程中创建包含 UIBezierPath 和 NSArray x Array 的 CGRect

Creating a CGRect that encompasses a UIBezierPath and NSArray x Array in the process

我需要做的就是创建一个包含 UIBezierPathCGRect,并且我有一个 CGPoint.

的数组

要创建这个 CGRect 我需要做的就是枚举 CGPoint 的数组并找到最小和最大 X 和 Y 坐标。

然后我想起了古老而优秀的 NSArray 有一个名为 valueForKeyPath 的函数,它可以与 valueForKeyPath:@max.xvalueForKeyPath:@min.x 之类的东西结合使用找到 x 和 y 的最小值和最大值的魔法。

我是 Swift 的新手。这是我第一次使用 Swift 来创建严肃的代码。

Swift 数组中是否有任何魔法可以用来做到这一点,而不是创建复杂的枚举和循环?

虽然您仍然可以访问 value(atKeyPath:) in Swift, there is 来执行此操作。我也碰巧认为它更清楚。省去可选项的问题,当然…

let list = [CGPoint(x: 10, y: 20),
            CGPoint(x: 1, y: 2),
            CGPoint(x: 100, y: 200)]
let max = list.map { [=10=].x }.max()
let min = list.map { [=10=].x }.min()
print(max, min)

// Output: Optional(100.0) Optional(1.0)

如果您已经拥有 UIBezierPath,那么简单的解决方案就是获取它的 bounds:

let rect = path.bounds

如果你有一个点数组并且想要包含这些点的边界,你可以 minmax xy 坐标,但是我可能 reduce 所有点的 union:

let points = [
    CGPoint(x: 200, y: 200),
    CGPoint(x: 300, y: 300),
    CGPoint(x: 200, y: 400),
    CGPoint(x: 100, y: 300)
]

let rect = points.first.map { firstPoint in
    points.dropFirst()
        .reduce(CGRect(origin: firstPoint, size: .zero)) { rect, point in
            rect.union(CGRect(origin: point, size: .zero))
    }
}