【问题标题】:Creating a CGRect that encompasses a UIBezierPath and NSArray x Array in the process在过程中创建一个包含 UIBezierPath 和 NSArray x Array 的 CGRect
【发布时间】:2019-07-29 22:20:29
【问题描述】:

我需要做的就是创建一个包含UIBezierPathCGRect,并且我有一个CGPoint 数组。

要创建这个CGRect,我需要做的就是枚举CGPoint 的数组并找到最小和最大X 和Y 坐标。

然后我记得旧的和好的 NSArray 有一个名为 valueForKeyPath 的函数,它可以与 valueForKeyPath:@max.xvalueForKeyPath:@min.x 之类的东西结合使用,可以神奇地找到最小值和最大值x 和 y。

我是 Swift 的新手。这是我第一次使用 Swift 编写严肃的代码。

在 Swift 数组中是否有任何魔法可以用来做到这一点,而不是创建复杂的枚举和循环?

【问题讨论】:

  • 你也可以在 Swift 中使用集合的 max 和/或 min 方法。顺便说一句,在 Swift 中编码时,您应该始终使用本机集合。 Array 总是优于 NSArray。
  • 好的,我知道我不应该在 swift 中使用 NSArray,但请记住我有一个 CGPoint 数组,所以我猜我不能使用 min/max。
  • if let maxX = points.max(by: { $0.x < $1.x }) { print(maxX) }
  • @Rob 是的,只是直线。 bounds...我怎么能错过。谢谢。如果您将此作为答案,我会接受,因为这是最佳答案。

标签: arrays swift max minimum


【解决方案1】:

如果您已经拥有UIBezierPath,简单的解决方案就是获取它的bounds

let rect = path.bounds

如果您有一个点数组并希望其边界包含这些点,您可以 minmax xy 坐标,但我可能会 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))
    }
}

【讨论】:

    【解决方案2】:

    虽然您仍然可以在 Swift 中访问 value(atKeyPath:),但有 a more idiomatic way 可以执行此操作。我也碰巧认为它更清楚。保存选项的问题,当然......

    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)
    

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多