2016-10-01 83 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

相關問題