我正在用一個數組收集到的卡片編寫紙牌遊戲。Swift - 對已過濾的數組結構進行重新排序並不會改變原始數組
卡的數據結構相同,但數據不同。
注:我的洗牌確實有效。
我想過濾這個數組,只洗牌我已經過濾的牌。
但是,雖然我可以洗牌,但我注意到,我原來的撲克牌陣列根本沒有改變。
我相信這個問題是由於我的卡模型是一個結構而不是類。
更多背景信息。
雖然每張卡的數據不同,但結構完全相同;這兩種類型都有一個名稱和一個數字值。
這是模擬如此;
enum FSCardType: Int {
case property
case anotherType
case yetAnotherType
}
// Card Model
struct FSCard {
let type: FSCardType
let name: String
let value: Int
var description: String {
return ("Name: \(self.name) Value: \(self.value), Type: \(self.type)")
}
}
我在這樣的靜態函數來創建我的卡片:
class FSCardAPI: NSObject {
public static func createCards() -> [FSCard] {
var cards:[FSCard] = [FSCard]()
let properties:[FSCard] = FSCardAPI.createProperties()
cards.append(contentsOf: properties)
return cards
}
public static func shuffleCards(cards:[FSCard]) -> [FSCard] {
let shuffled:[FSCard] = GKRandomSource.sharedRandom().arrayByShufflingObjects(in: cards) as! [FSCard]
return shuffled
}
fileprivate static func createProperties() -> [FSCard] {
var properties:[FSCard] = [FSCard]()
for idx in 1...30 {
let property:FSCard = FSCard(type: .property, name: "Property #\(idx)", value: idx, owner: nil)
properties.append(property)
}
return properties
}
}
好了,現在我只想這個卡陣列內的洗牌我的產權證。
我XCTest
文件
所以首先過濾那些類型的所有卡:property
func testShuffleProperties() {
var propertyCards = gameModel.cards.filter { (fs:FSCard) -> Bool in
return (fs.type == .property)
}
propertyCards = FSCardAPI.shuffleCards(cards: propertyCards)
print(propertyCards)
print(" ---- ")
print(gameModel.cards)
}
這就要求:
// Inside my FSCardAPI
public static func shuffleCards(cards:[FSCard]) -> [FSCard] {
let shuffled:[FSCard] = GKRandomSource.sharedRandom().arrayByShufflingObjects(in: cards) as! [FSCard]
return shuffled
}
問題:
當我跑我的XCTest ,我注意到雖然propertyCards
被洗牌,但我的gameModel.cards
不是shuf逃跑。
Test Case 'testShuffleProperties' started.
// contents of `propertyCards`
[FSCard(type: FSCardType.property, name: "Property #4", value: 4, owner: nil),
FSCard(type: FSCardType.property, name: "Property #16", value: 16, owner: nil),
// .. etc
// contents of `gameModel.cards`
[FSCard(type: FSCardType.property, name: "Property #1", value: 1, owner: nil),
FSCard(type: FSCardType.property, name: "Property #2", value: 2, owner: nil),
// .. etc
摘要
- 我有卡的陣列(即:30卡)
- 卡由類型分開(即:屬性)
- 我要篩選的屬性卡和洗牌只有這些卡
- 我想原始數組反映這些變化
在我的測試中,數組被洗牌;但原始數組保持不變。
我可以想到的一種方式是我做所有的洗牌,然後通過卡片類型對數組進行排序,然後更新gameModel.cards,但這似乎有點超過頂部。
我可以考慮解決這個問題的另一個顯而易見的方法是將我的struct
更改爲class
或;也許我需要在結構之間的另一層?
所以我的查詢是:
如何過濾結構的數組,只有那些洗牌的結果和改變原始陣列的狀態?
非常感謝
編輯:
屬性陣列是洗牌的唯一項目。
如果我添加另一個數組到列表中,它不應該洗牌整個內容。
IE;如果我這樣做:
public static func createCards() -> [FSCard] {
var cards:[FSCard] = [FSCard]()
let properties:[FSCard] = FSCardAPI.createProperties()
let cheqs:[FSCard] = FSCardAPI.createCheques()
cards.append(contentsOf: properties)
cards.append(contentsOf: cheqs)
return cards
}
我應該只在自己內部洗牌而不會影響cheqs。
我想我可以更容易,只有2個數組,但同時我認爲沒有理由這樣做,因爲數據結構是相同的。
請顯示'FSCardAPI.createCards代碼()'。在FSGameModel你在哪裏調用shuffle? – Scriptable
我已經添加了createCards()位 – zardon
我試圖使用類而不是我的卡模型的結構,但結果是相同的;我相信它是因爲我永遠不會更改'gameModel.cards'的內容 - 理想情況下我想過濾這些卡片,將它們洗牌並更新此卡片數組。 – zardon