我有一个自定义的结构
,用于创建、洗牌和发牌。
struct Card {
let pip : Pip
let suit : Suit
var isFaceCard : Bool {
return pip.rawValue > 10
}
var color : CardColor {
return suit.color
}
}
其次,我有一个玩家字典,每个玩家都有一个卡片集合。
var Players = ["Scott": [Card](), "Bob": [Card](), "John": [Card]()]
为了有效地从我已经洗牌的牌组发牌,我计划循环遍历玩家字典两次,每次发一张牌,就像现场发生的那样。
是否可以简单地将 Card 类型附加到 Card 集合中?我的尝试似乎没有奏效。 d
是 Card 类型的洗牌 Deck(Collection)。
Players["Scott"].append(d.deal())
编辑1
通过为每个播放器使用结构,我添加了这个
struct Player {
let name : String
var cards : [Card]
}
var Players = [Player]()
Players.append(Player(name:"Scott"))
我是否必须在初始化时给玩家他们的“牌”,或者我可以稍后发牌吗?由于上面的代码会产生错误。
Players.append(Player(name:"Scott", cards: [Card]()))
以上是否正确?
最佳答案
直接回答:
如果玩家可以拥有一组纸牌,那么 Player 应该是一个结构体,并且该结构体应该包含一组纸牌作为属性。我建议在这里完全不要使用字典。
编辑后:
你走在正确的轨道上。
如果您自己为您的结构创建一个初始化器,您就不必在初始化时给玩家他们的卡片:
struct Player {
let name : String
var cards : [Card] = []
init(name: String) {
self.name = name
}
}
这样做会取消成员初始化器的自动生成,只有你的初始化器可用。
但是如果你想保留自动成员初始化器,你可以在初始化时传递一个空的卡片数组:
struct Player {
let name : String
var cards : [Card]
}
let joe = Player(name: "Joe", cards: [])
评论之后:
如果您将所有玩家都放在一个数组中,则可以使用带有闭包谓词的 indexOf
来获取特定玩家,例如:
struct Player {
let name : String
var cards : [Card] = []
init(name: String) {
self.name = name
}
func fold() {
print("\(name) just folded")
}
}
var players = [Player]()
players.append(Player(name: "Joe"))
players.append(Player(name: "Jane"))
players.append(Player(name: "Jack"))
players.append(Player(name: "Janice"))
if let janeIndex = players.indexOf({ $0.name == "Jane" }) {
players[janeIndex].fold()
}
假设您希望所有玩家弃牌,只有一个玩家弃牌,您可以使用 filter
:
let notJack = players.filter { $0.name != "Jack" }
notJack.forEach { $0.fold() }
关于ios - .append() 到自定义结构的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588634/