Arrays 在此过程中创建包含UIBezierPath和NSArray x数组的CGRect
我需要做的就是创建一个Arrays 在此过程中创建包含UIBezierPath和NSArray x数组的CGRect,arrays,swift,max,minimum,Arrays,Swift,Max,Minimum,我需要做的就是创建一个CGRect,它包含一个UIBezierPath,我有一个CGPoint数组 要创建这个CGRect我需要做的就是枚举CGPoint的数组,并找到最小和最大的X和Y坐标 然后我想起了旧的、好的NSArray有一个名为valueForKeyPath的函数,它可以与valueForKeyPath:@max.x或valueForKeyPath:@min.x这样的函数结合使用,可以神奇地找到x和y的最小值和最大值 我不熟悉斯威夫特。这是我第一次使用Swift创建严肃的代码 Swif
CGRect
,它包含一个UIBezierPath
,我有一个CGPoint
数组
要创建这个CGRect
我需要做的就是枚举CGPoint
的数组,并找到最小和最大的X和Y坐标
然后我想起了旧的、好的NSArray
有一个名为valueForKeyPath
的函数,它可以与valueForKeyPath:@max.x
或valueForKeyPath:@min.x
这样的函数结合使用,可以神奇地找到x和y的最小值和最大值
我不熟悉斯威夫特。这是我第一次使用Swift创建严肃的代码
Swift数组中有什么魔法可以用来实现这一点,而不是创建复杂的枚举和循环吗?当您仍然可以在Swift中访问时,可以这样做。我也认为这更清楚。当然,保存选项的问题
let list = [CGPoint(x: 10, y: 20),
CGPoint(x: 1, y: 2),
CGPoint(x: 100, y: 200)]
let max = list.map { $0.x }.max()
let min = list.map { $0.x }.min()
print(max, min)
// Output: Optional(100.0) Optional(1.0)
如果您已经有了
UIBezierPath
,那么简单的解决方案是只获取其:
如果您有一个点数组,并且想要包含这些点的边界,您可以
min
和max
x和y
坐标,但我可以减少所有点的坐标:
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))
}
}
您也可以在Swift中使用集合的max和/或min方法。顺便说一句,在使用Swift编码时,您应该始终使用本机集合。数组总是比NSArray更受欢迎。好吧,我知道我不应该在swift中使用NSArray,但请记住我有一个CGPoint数组,所以我猜我不能使用min/max。如果让maxX=points.max(by:{$0.x<$1.x}){
打印(maxX)
@Rob是的,就直线<代码>边界
。。。我怎么会错过呢。谢谢如果你回答这个问题,我会接受,因为这是最好的答案。
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))
}
}