在Swift中找到CGPoints数组最左边位置的正确方法
从中提取,我尝试使用在Swift中找到CGPoints数组最左边位置的正确方法,swift,reduce,cgpoint,Swift,Reduce,Cgpoint,从中提取,我尝试使用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($0.x,$1.x)} 但是,我得到了这个错误: `Type 'CGPoint' does not conform to protocol 'Compara
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($0.x,$1.x)}
但是,我得到了这个错误:
`Type 'CGPoint' does not conform to protocol 'Comparable'
当然,我不是在比较CGPoint,我是在比较点.x
,它应该是一个CGFloat
想法?数组包含
CGPoint
,而在reduce闭包中,您试图返回CGFloat
——您必须将其转换为CGPoint
:
var leftMost = a.reduce(CGPoint(x:CGFloat.greatestFiniteMagnitude,y:CGFloat.greatestFiniteMagnitude)) {
CGPoint(x: min($0.x,$1.x), y: $0.y)
}.x
我知道,错误消息没有多大帮助:)
实现相同结果的另一种方法是首先将点转换为x坐标,然后减少:
var leftMost = a.map { $0.x }.reduce(CGFloat.greatestFiniteMagnitude) { min($0,$1) }
可能更容易阅读,但在性能方面可能更昂贵。但正如@MartinR所说,它也可以简化为:
var leftMost = a.reduce(CGFloat.greatestFiniteMagnitude) { min($0, $1.x) }
数组包含
CGPoint
,而在reduce闭包中,您试图返回CGFloat
——您必须将其转换为CGPoint
:
var leftMost = a.reduce(CGPoint(x:CGFloat.greatestFiniteMagnitude,y:CGFloat.greatestFiniteMagnitude)) {
CGPoint(x: min($0.x,$1.x), y: $0.y)
}.x
我知道,错误消息没有多大帮助:)
实现相同结果的另一种方法是首先将点转换为x坐标,然后减少:
var leftMost = a.map { $0.x }.reduce(CGFloat.greatestFiniteMagnitude) { min($0,$1) }
可能更容易阅读,但在性能方面可能更昂贵。但正如@MartinR所说,它也可以简化为:
var leftMost = a.reduce(CGFloat.greatestFiniteMagnitude) { min($0, $1.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
}
枚举位置{
箱顶
箱底
最左边的
最右边的案例
}
func findPoint(点:[CGPoint],位置:position)->CGPoint?{
var结果:CGPoint?
开关(位置){
案例.最底层:
结果=点.max{a,b在a.yb.y}
案例。最左边的:
结果=points.max{a.x>b.x}
案例。最右边:
结果=点.max{a,b在a.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
}
枚举位置{
箱顶
箱底
最左边的
最右边的案例
}
func findPoint(点:[CGPoint],位置:position)->CGPoint?{
var结果:CGPoint?
开关(位置){
案例.最底层:
结果=点.max{a,b在a.yb.y}
案例。最左边的:
结果=points.max{a.x>b.x}
案例。最右边:
结果=点.max{a,b在a.x
第二个解决方案也可以写成var leftMost=a.reduce(CGFloat.max){min($0,$1.x)}
–易于阅读和执行:)@MartinR:今天,您的任务是找到我的解决方案的简化版本。。。不是吗?;-)再次感谢汉克斯。事实上,var leftMost=a.reduce(CGFloat.max){min($0,$1.x)}
就是我想要的。你和@MartinR都应该分享@安东尼奥:我不会对你的两种解决方案的性能打赌。我知道这样的循环很容易被编译器识别和优化,最终得到几乎相似的机器代码。虽然我不能代表斯威夫特说话。如果性能很重要,那么无论如何都应该制定基准。但在一般的可读性规则中,这会从CGPoint数组返回最小值,我还需要从CGPoint数组中得到max X,尝试使用max而不是min来获得它,但它对我不起作用。你们能分享从CGPoint数组中查找max X的代码吗?提前感谢。:)第二个解决方案也可以写成var leftMost=a.reduce(CGFloat.max){min($0,$1.x)}
–易于阅读和执行:)@MartinR:今天,您的任务是找到我的解决方案的简化版本。。。不是吗?;-)再次感谢汉克斯。事实上,var leftMost=a.reduce(CGFloat.max){min($0,$1.x)}
就是我想要的。你和@MartinR都应该分享@安东尼奥:我不会对你的两种解决方案的性能打赌。我知道这样的循环很容易被编译器识别和优化,最终得到几乎相似的机器代码。虽然我不能代表斯威夫特说话。如果性能很重要,那么无论如何都应该制定基准。但在一般的可读性规则中,这会从CGPoint数组返回最小值,我还需要从CGPoint数组中得到max X,尝试使用max而不是min来获得它,但它对我不起作用。你们能分享从CGPoint数组中查找max X的代码吗?提前感谢。:)