我们有一组CGPoints:
let points = [(1234.0, 1053.0), (1241.0, 1111.0), (1152.0, 1043.0)]
我想做的是获取数组中x值最高的CGPoint和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。是否可以从数组中获取这些值?
您可以使用max(by:)
。
let minXPoint = points.min(by: {$0.x < $1.x}) //(1152.0, 1043.0)
let maxYPoint = points.max(by: {$0.y < $1.y}) //(1241.0, 1111.0)
[使用min()
/ max()
,您不能这样做。
y和x坐标的最高和最低坐标“
具有最小x值的点可能不同于具有最小x值的点。因此,仅返回一个点(如min()
/ max()
一样)的任何方法都是不够的。
您要么需要两个单独的调用,例如:
let minX = points.min(by: { $0.x < $1.x })!.x
let minY = points.min(by: { $0.y < $1.y })!.y
let maxX = points.min(by: { $0.x > $1.x })!.x
let maxY = points.min(by: { $0.y > $1.y })!.y
或者您可以尝试通过reduce一次完成所有操作:
let initialAccumulator = (
minX: CGFloat.max, minY: CGFloat.max, maxX: CGFloat.min, maxY: CGFloat.min)
let (minX, minY, maxX, maxY) = points.reduce(initialAccumulator) { accumulator, point in
return (
minX: min(accumulator.minX, point.x),
minY: min(accumulator.minY, point.y),
maxX: max(accumulator.maxX, point.x),
maxY: max(accumulator.maxY, point.y)
)
}