向自定义结构体的集合中添加 .append() 方法

3
我有一个自定义的struct,用于创建、洗牌和发牌扑克牌。
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是一个洗过的Deck(Collection)包含Card类型。
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]()))

上述内容是否正确?

3
如果玩家可以拥有一组卡牌,那么Player应该是一个结构体,并且应包含一组卡牌作为属性。我建议在这里完全不使用字典。 - Eric Aya
这是个好主意,我会试一下然后回报结果。 - scottevans93
请记得如果需要的话,您可以[编辑]您的问题。 :) - Eric Aya
我在评论垃圾信息中也有同样的想法 :P - scottevans93
1个回答

1

直接回答:

如果玩家可以拥有一组卡牌,则玩家应该是一个结构体,并且这个结构体应该包含一个卡牌数组作为属性。我建议在这里根本不使用字典。

在您的编辑后:

你走在正确的道路上。

如果为你的结构体创建一个初始化程序,你就不必在初始化时给玩家他们的卡牌:

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() }

啊,我明白了。单独地,如果我需要折叠特定的玩家,是否有一种“正确”的方式按名称访问每个玩家? - scottevans93
可能是玩家的另一个属性,例如“状态”。 - scottevans93
我已经添加了示例。 - Eric Aya
不客气。要注意结构体和类(值类型 vs 引用类型)之间的区别,这样你就没问题了。// 我想你可以看看我的PokerHands存储库:https://github.com/ericdke/PokerHands,以发现类似的技巧。它还远非完美,但其中有很好的东西。;) - Eric Aya
实际上这些错误很微不足道,很容易修复。新版本已经发布,现在可以在Xcode 8 beta 3上使用。;) - Eric Aya
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接