Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中找到CGPoints数组最左边位置的正确方法_Swift_Reduce_Cgpoint - Fatal编程技术网

在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的代码吗?提前感谢。:)