【问题标题】:.append() to a Collection of custom Structs.append() 到自定义结构的集合
【发布时间】:2016-07-26 11:26:47
【问题描述】:

我有一个自定义的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卡片 类型的洗牌 DeckCollection)。

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 应该是一个结构体并且它应该包含一个卡片数组作为属性。我建议在这里完全不要使用字典。
  • 这是个好主意,我会尝试并反馈
  • 请记住,如果需要,您可以edit您的问题。 :)
  • 我在垃圾评论中也有同样的想法:P

标签: ios arrays swift struct


【解决方案1】:

直接回答:

如果一个玩家可以拥有一个卡片数组,那么一个 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: [])

在你的 cmets 之后:

如果您将所有玩家都放在一个数组中,您可以使用带有闭包谓词的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() }

【讨论】:

  • 啊,我明白了。另外,如果我需要折叠特定玩家,是否有一种“正确”的方式可以按名称访问每个玩家?
  • 这可能是播放器的另一个属性,例如“状态”
  • 我已经添加了示例。
  • 非常感谢。只是为了最后一次挑选你的大脑。在纸牌游戏场景中,我还应该注意什么其他概念?
  • 不客气。请注意结构和类之间的区别(值与引用),你会没事的。 // 我想你可以看看我的 PokerHands 存储库:github.com/ericdke/PokerHands 以发现类似的技术。它远非完美,但其中有好东西。 ;)
猜你喜欢
  • 2019-09-18
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多