在此过程中创建包含 UIBezierPath 和 NSArray x Array 的 CGRect
Creating a CGRect that encompasses a UIBezierPath and NSArray x Array in the process
我需要做的就是创建一个包含 UIBezierPath
的 CGRect
,并且我有一个 CGPoint
.
的数组
要创建这个 CGRect
我需要做的就是枚举 CGPoint
的数组并找到最小和最大 X 和 Y 坐标。
然后我想起了古老而优秀的 NSArray
有一个名为 valueForKeyPath
的函数,它可以与 valueForKeyPath:@max.x
或 valueForKeyPath:@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
如果你有一个点数组并且想要包含这些点的边界,你可以 min
和 max
x
和 y
坐标,但是我可能 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))
}
}
我需要做的就是创建一个包含 UIBezierPath
的 CGRect
,并且我有一个 CGPoint
.
要创建这个 CGRect
我需要做的就是枚举 CGPoint
的数组并找到最小和最大 X 和 Y 坐标。
然后我想起了古老而优秀的 NSArray
有一个名为 valueForKeyPath
的函数,它可以与 valueForKeyPath:@max.x
或 valueForKeyPath:@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
如果你有一个点数组并且想要包含这些点的边界,你可以 min
和 max
x
和 y
坐标,但是我可能 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))
}
}