您可以映射值以查找 x 和 y 坐标中的最小值和最大值,如下所示。如果您不确定是否points
数组包含任何数据,请使用保护语句以避免强制解包:
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: maxX, y: maxY)
那么您可以修改扩展函数,因为您已经知道哪些值是最小值和最大值:
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
}
}
}