2016-10-01 64 views
0

我有一个CGPoint s和数组数组阵列的函数。我一直在'手动'删除每个数组中的点并将它们逐个添加回去。这当然是一种乏味而低效的方法。我正在寻找一种更有效的方式来处理删除和追加到阵列点。这里是我的代码:如何从几个数组中删除一个元素并重新追加?

func setSpritePositions() { 
    groupA1 = [p1, p4, p6, p8] 
    groupA2 = [p1, p3, p2, p5] 

    groupB1 = [p1, p7, p2, p6] 
    groupB2 = [p9, p4, p3, p2] 
    groupB2 = [p2, p4, p5, p8] 

    groupC1 = [p1, p7, p2, p7] 
    groupC2 = [p9, p4, p3, p2] 
    groupC3 = [p4, p5, p6, p7] 
    groupC4 = [p5, p1, p3, p4] 

    groupA = [groupA1, groupA2] 
    groupB = [groupB1, groupB2, groupB3] 
    groupC = [groupC1, groupC2, groupC3, groupC4] 

    groups = [groupA, groupB, groupC] 

} 

例如,我会怎样去除点p1p3p7从包含它们的阵列和注意的数组和位置追加回来。我将如何实现这一目标?正如我所说,我一直在做,这太麻烦了。

UPDATE

我使用位置的各组来限制我的游戏精灵的运动。有时候我想删除某些位置,并能够告诉哪些数组将它们追加回来。

+0

迭代'组'。对于每个数组,迭代其数组。对于每个数组,请查看它是否包含该点。如果是这样,请删除并追加它。 – rmaddy

+0

@rmaddy你是指通过'groups'访问所有其他数组?我正在使用所有其他数组,所以'group'中的变化本身不会影响另一个数组,因为swift数组是值类型。我正在考虑使用'NSArray's,但要操纵它们以获得特定结果将非常非常困难。 – OnlyCodeMatters

+0

“,然后将这些位置追加回来”你真的要在这里追加(如在数组末尾),还是你的意思是“有时候p1是活动的,有时不是。“我假设后者,并且如果p1对于一个组是无效的,那么对于所有组是不活动的 –

回答

1

答案是更好的类型。首先,如果你想让点有共享状态,那么你需要一个引用类型,而不是一个值类型。您应该将您的积分提升为参考位置:

final class Location { 
    let point: CGPoint 
    var isActive: Bool = true 
    init(_ point: CGPoint) { self.point = point } 
} 

现在您可以打开和关闭位置。

下面是一个如何使用更好的类型的例子。有很多方法来设计这个;这只是一个。然后,您可以将位置分组为段:

struct LocationSegment { 
    let locations: [Location] 
    var activePoints: [CGPoint] { 
     return locations.filter{ $0.isActive }.map{ $0.point }.uniqueValues() 
    } 
} 

这使得轻松获取activePoints列表。这是假设像一个延伸:

extension Array where Element: Equatable { 
    // Warning: This is O(n^2). You can't do better than that without making CGPoint Hashable 
    // (which is easy, but left as a separate problem.) 
    func uniqueValues() -> [Element] { 
     var result: [Element] = [] 
     for element in self { 
      if !result.contains(element) { 
       result.append(element) 
      } 
     } 
     return result 
    } 
} 

现在我们有了段,我们可以把它们放在组:

struct LocationGroup { 
    let segments: [LocationSegment] 
    var activePoints: [CGPoint] { return segments.flatMap { $0.activePoints }.uniqueValues() } 
} 

如果我们有组阵列:

let groups = [groupA, groupB, groupC] 

我们可以得到所有的积极点:

groups.flatMap { $0.activePoints } 

再次,这只是一种方法。你可能想groups是一个比[LocationGroup]更强的类型,或者你可能想重新设计LocationGroup是一个递归枚举,所以你可以完全用值类型来构建它(尽管我认为这个特殊的问题在底部引用了一个引用类型) 。关键是要建立能够说明你的意思的类型,而不是强迫数组成为你想要的一切。

+0

哇!这不仅解决了这个问题,但它我解决了其他六个问题,非常感谢,非常感谢。 – OnlyCodeMatters

相关问题