我正在用一个数组收集到的卡片编写纸牌游戏。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