Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
Arrays 在此过程中创建包含UIBezierPath和NSArray x数组的CGRect_Arrays_Swift_Max_Minimum - Fatal编程技术网

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))
    }
}