在 Swift 的 CGPoints 数组中找到最左边位置的正确方法
Correct way to find leftmost position in an Array of CGPoints in Swift
根据 Correct way to find max in an Array in Swift,我试图使用 reduce
在 Swift 数组中找到最左边的位置。我本以为这会起作用:
var a = [CGPoint(x:1,y:1),CGPoint(x:2,y:2),CGPoint(x:0,y:0)]
var leftMost = a.reduce(CGPoint(x:CGFloat.max,y:CGFloat.max)) {min([=11=].x,.x)}
但是,我得到这个错误:
`Type 'CGPoint' does not conform to protocol 'Comparable'
当然,我不是在比较CGPoint,我是在比较点.x
,应该是CGFloat
.
想法?
数组包含 CGPoint
,而在 reduce 闭包中,您试图 return 一个 CGFloat
- 您必须将其转换为 CGPoint
:
var leftMost = a.reduce(CGPoint(x:CGFloat.greatestFiniteMagnitude,y:CGFloat.greatestFiniteMagnitude)) {
CGPoint(x: min([=10=].x,.x), y: [=10=].y)
}.x
我知道,错误消息没有多大帮助:)
实现相同结果的另一种方法是先将点转换为 x 坐标,然后再减少:
var leftMost = a.map { [=11=].x }.reduce(CGFloat.greatestFiniteMagnitude) { min([=11=],) }
可能更容易阅读,但在性能方面可能更昂贵。但正如@MartinR 所建议的,它也可以简化为:
var leftMost = a.reduce(CGFloat.greatestFiniteMagnitude) { min([=12=], .x) }
Swift 5 实施:
用法:
let leftMost = self.findPoint(points: points, position: .leftMost)
函数和枚举:
enum Position {
case topMost
case bottomMost
case leftMost
case rightMost
}
func findPoint(points: [CGPoint], position: Position) -> CGPoint? {
var result: CGPoint?
switch (position) {
case .bottomMost:
result = points.max { a, b in a.y < b.y }
case .topMost:
result = points.max { a, b in a.y > b.y }
case .leftMost:
result = points.max { a, b in a.x > b.x }
case .rightMost:
result = points.max { a, b in a.x < b.x }
}
return result
}
根据 Correct way to find max in an Array in Swift,我试图使用 reduce
在 Swift 数组中找到最左边的位置。我本以为这会起作用:
var a = [CGPoint(x:1,y:1),CGPoint(x:2,y:2),CGPoint(x:0,y:0)]
var leftMost = a.reduce(CGPoint(x:CGFloat.max,y:CGFloat.max)) {min([=11=].x,.x)}
但是,我得到这个错误:
`Type 'CGPoint' does not conform to protocol 'Comparable'
当然,我不是在比较CGPoint,我是在比较点.x
,应该是CGFloat
.
想法?
数组包含 CGPoint
,而在 reduce 闭包中,您试图 return 一个 CGFloat
- 您必须将其转换为 CGPoint
:
var leftMost = a.reduce(CGPoint(x:CGFloat.greatestFiniteMagnitude,y:CGFloat.greatestFiniteMagnitude)) {
CGPoint(x: min([=10=].x,.x), y: [=10=].y)
}.x
我知道,错误消息没有多大帮助:)
实现相同结果的另一种方法是先将点转换为 x 坐标,然后再减少:
var leftMost = a.map { [=11=].x }.reduce(CGFloat.greatestFiniteMagnitude) { min([=11=],) }
可能更容易阅读,但在性能方面可能更昂贵。但正如@MartinR 所建议的,它也可以简化为:
var leftMost = a.reduce(CGFloat.greatestFiniteMagnitude) { min([=12=], .x) }
Swift 5 实施:
用法:
let leftMost = self.findPoint(points: points, position: .leftMost)
函数和枚举:
enum Position {
case topMost
case bottomMost
case leftMost
case rightMost
}
func findPoint(points: [CGPoint], position: Position) -> CGPoint? {
var result: CGPoint?
switch (position) {
case .bottomMost:
result = points.max { a, b in a.y < b.y }
case .topMost:
result = points.max { a, b in a.y > b.y }
case .leftMost:
result = points.max { a, b in a.x > b.x }
case .rightMost:
result = points.max { a, b in a.x < b.x }
}
return result
}