首页 > 解决方案 > 在 Swift 中检查数组中的所有元素

问题描述

对于我的应用程序,我试图确定圆形视图数组中的元素是否相互重叠。我有一个 for 循环,它遍历数组中的圆形元素,检查元素是否与前一个元素重叠,如果是的话;改变元素在视图中的位置:

func drawCircles(){
    for c in circles {
        c.center =  getRandomPoint()
        let prev = circles.before(c)
                
        if let prevCircleCenter = prev?.center {
            let dist = distance(prevCircleCenter, c.center)
            //50 = width of each circle
            if dist <= 50 {
              
                var newCenter = c.center
                var centersVector = CGVector(dx: newCenter.x - prevCircleCenter.x, dy: newCenter.y - prevCircleCenter.y)

                centersVector.dx *= 51 / dist
                centersVector.dy *= 51 / dist
                newCenter.x = prevCircleCenter.x + centersVector.dx
                newCenter.y = prevCircleCenter.y + centersVector.dy
                c.center = newCenter
            }
        }
    }
    
    for c in circles {
        self.view.addSubview(c)
    }
}

这是我用来检查前一个元素的方法:

extension BidirectionalCollection where Element: Equatable {
    func before(_ element: Element, loop: Bool = false) -> Element? {
        if element == first && loop { return last }
        guard let index = dropFirst().firstIndex(of: element) else {
            return nil
        }
        return self[self.index(before: index)]
    }
}

我曾尝试添加一个内部 for 循环来重新检查所有下一个和上一个元素是否重叠,但这似乎不起作用。

所以,我想我想弄清楚如何检查数组中的每个 CircleView 元素,以确保它们没有重叠的位置。

标签: iosarraysswiftfor-loop

解决方案


不确定圆的数组,但要检查圆数组的每个元素,您可以使用嵌套循环。下面的代码可能会对您有所帮助。

for i in 0..<circles.count{
circles[i].center = getRandomPoint()
for j in 0..<circles.count{
    if(i != j){
        let comparingCentre = circles[j].center
        let dist = distance(comparingCentre, circles[i].center)
        if dist <= 50 {
            
            var newCenter = circles[i].center
            var centersVector = CGVector(dx: newCenter.x - comparingCentre.x, dy: newCenter.y - comparingCentre.y)
            
            centersVector.dx *= 51 / dist
            centersVector.dy *= 51 / dist
            newCenter.x = comparingCentre.x + centersVector.dx
            newCenter.y = comparingCentre.y + centersVector.dy
            circles[i].center = newCenter
        }
    }
}
}

推荐阅读