gpt4 book ai didi

swift - 如何从数组中的结构检索结果

转载 作者:行者123 更新时间:2023-11-28 15:11:29 25 4
gpt4 key购买 nike

我有一个枚举和结构,如下所示。

enum Position: String {
case lw = "Left Wing"
case rw = "Right Wing"
case c = "Centre"
case d = "Defense"
case g = "Goalie"
}

struct PlayerInformation {
let firstName: String
let lastName: String
let position: Position
let number: Int

}

struct ShiftDetails {
let player: PlayerInformation
var timeOnIce: Int
var dateOnIce: Date
}

我使用以下内容构建 playerInformationArray:

var playerInformationArray = [PlayerInformation]()

let sidneyCrosby = PlayerInformation.init(firstName: "Sidney", lastName: "Crosby", position: Position.c, number: 87)
let alexOvechkin = PlayerInformation.init(firstName: "Alex", lastName: "Ovechkin", position: Position.lw, number: 8)
let patrickKane = PlayerInformation.init(firstName: "Patrick", lastName: "Kane", position: Position.rw, number: 88)

playerInformationArray.append(sidneyCrosby)
playerInformationArray.append(alexOvechkin)
playerInformationArray.append(patrickKane)

我在以下数组中存储有关玩家“轮类”的信息:

var shiftDetails = [ShiftDetails]()

我使用以下内容从 Collection View 中检索有关“选定”玩家的信息:

let selectedPlayer = playerInformationArray[indexPath.row]

然后我使用以下内容更新 shiftDetails 数组:

shiftDetails.append( ShiftDetails.init(player: selectedPlayer, timeOnIce: timerCounter, dateOnIce: Date()) )

一切正常,但我很难理解如何从数组中检索数据。例如:

我如何检索每个玩家的 shiftDetailscount

我如何检索每个玩家的 timeOnIcesum

谢谢!

最佳答案

如果您需要检查某个玩家是否等于另一个玩家,您需要使其符合实现双重相等运算符 == 的 Equatable 协议(protocol)。您还可以使您的结构符合 `CustomStringConvertible 并为其提供自定义描述:

struct Player: Equatable, CustomStringConvertible {
let firstName: String
let lastName: String
let position: Position
let number: Int
static func ==(lhs: Player, rhs: Player) -> Bool {
return lhs.firstName == rhs.firstName && lhs.lastName == rhs.lastName
}
var description: String {
return "Player: " + firstName + " " + lastName
}
}

此外,在 Swift 中,您应该始终更喜欢长名称(驼峰式命名)以获得更好的可读性,并在命名属性时尽量避免冗余信息,并且您不应将类型添加到对象名称中:

enum Position: String {
case leftWing = "Left Wing"
case rightWing = "Right Wing"
case center = "Center"
case defense = "Defense"
case golie = "Goalie"
}

struct Shift {
let player: Player
var timeOnIce: Int
var dateOnIce: Date
}

var players: [Player] = []

let sidneyCrosby = Player(firstName: "Sidney", lastName: "Crosby", position: .center, number: 87)
let alexOvechkin = Player(firstName: "Alex", lastName: "Ovechkin", position: .leftWing, number: 8)
let patrickKane = Player(firstName: "Patrick", lastName: "Kane", position: .rightWing, number: 88)

players += [sidneyCrosby, alexOvechkin, patrickKane]

var shifts: [Shift] = []
var index = IndexPath(row: 0, section: 0)
var selectedPlayer = players[index.row]
let shift1 = Shift(player: selectedPlayer, timeOnIce: 3, dateOnIce: Date())
shifts.append(shift1)
let shift2 = Shift(player: selectedPlayer, timeOnIce: 5, dateOnIce: Date())
shifts.append(shift2)

要对每个玩家的 timeOnIce 属性及其计数求和,您可以扩展 Array 将元素限制为 Shift 类型:

extension Array  where Element == Shift {
func timeOnIceAndCount(for player: Player) -> (timeOnIce: Int, count: Int) {
return reduce((0,0)) {
$1.player == player ? ($0.0 + $1.timeOnIce, $0.1 + 1) : $0
}
}
}

let (timeOnIce, count) = shifts.timeOnIceAndCount(for: selectedPlayer)
print(selectedPlayer)
print("TimeOnIce:",timeOnIce)
print("Count: ", count)

这将打印

Player: Sidney Crosby

TimeOnIce: 8

Count: 2

关于swift - 如何从数组中的结构检索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com