验证和交换元素 swift

Verify and swap elements swift

对于初学者的问题和我糟糕的英语感到抱歉。

我需要在我的 class 团队中创建一个函数来检查我的数组以查看玩家是否存在,如果不存在,它将 return 出错,如果存在,它将在两个数组之间进行交换。

示例:我有一个包含首发球员和替补球员的数组,球员 1,2 和 3 是首发球员,球员 4,5 和 6 是替补球员。

所以当我想交换玩家时,我可以使用类似的东西:Team.swapfunc(player1, player4) 或类似的东西

我的示例代码:

class SoccerPlayers {
let name: String
let number: Int
init(name: String, number: Int) {

    self.name = name
    self.number = number
}
}
class Team {

    var nameTeam: String

    // Array of players
    var startingPlayers:[SoccerPlayers] = []
    var reservePlayers:[SoccerPlayers] = []

    init(nameTeam:String, startingPlayers: [SoccerPlayers], reservePlayers: [SoccerPlayers]) {
        self.nameTeam = nameTeam
        self.startingPlayers = startingPlayers
        self.reservePlayers = reservePlayers
    }
}

var player1: SoccerPlayers = SoccerPlayers(    
    name: "Andre",
    number: 1
)

var player2: SoccerPlayers = SoccerPlayers(    
    name: "Joao",
    number: 2
)

var player3: SoccerPlayers = SoccerPlayers(    
    name: "Matheus",
    number: 3
)

var player4: SoccerPlayers = SoccerPlayers(    
    name: "Junior",
    number: 4
)

var player5: SoccerPlayers = SoccerPlayers(    
    name: "Fabio",
    number: 5
)

var player6: SoccerPlayers = SoccerPlayers(
    name: "Paulo",
    number: 6
)

let team1 = Team(nameTeam:"YourTeam", startingPlayers:[player1, player2, player3], reservePlayers:[player4, player5, player6])
 }

obs:此代码仅供学习,并非真正的工作项目

我们来分解一下,我们需要做的是

  • 检查相应数组中是否存在玩家
  • 从数组中删除它们
  • 将它们插入另一个数组

为了检查玩家是否存在,我们希望能够比较两个玩家,我们可以手动执行此操作,也可以使玩家类型对应于 Equatable 并确定是什么让两个玩家相等,这里我决定它是唯一定义玩家的数字,所以我们使用它。

struct SoccerPlayer: Equatable { // Conform to Equatable
    let name: String
    let number: Int

    // This function will automatically be used whenever some other function want's to check if two players are equal
    static func == (lhs: SoccerPlayer, rhs: SoccerPlayer) {
        lhs.number == rhs.number
    }
}

请注意,我已将 class 更改为结构,因为这是针对此类 data/functionality 的推荐结构。 我还将名称更改为 SoccerPlayer,因为每个实例都有一个玩家

在 swap 函数中,我们需要检查一个玩家,然后将其从数组中删除,查看 Array 类型,我们看到它有一个以索引(数组中的位置)作为参数的删除函数,所以我们想先得到每个玩家的索引。

函数 firstIndex(of:) 在这里是完美的,因为它 return 是一个索引,如果没有找到则为 nil,所以我们也可以用它来进行验证。

let playerIndex = startingPlayers.firstIndex(of: player)

如果数组不包含玩家,这里的 playerIndex 将为 nil,也不会将玩家作为参数传递给函数,这是可以完成的,因为它符合 Equatable

为了执行检查并一次性获得结果,我们使用 guard 语句。一旦我们有了索引,我们就可以从一个数组中删除玩家并将他们添加到另一个数组中。这是属于 Team

的完整交换功能
 mutating func swap(player: SoccerPlayer, substitute: SoccerPlayer) -> Bool {
    guard let playerIndex = startingPlayers.firstIndex(of: player),
          let substituteIndex = reservePlayers.firstIndex(of: substitute) else {
              return false
          }

    // Use the indices to remove players
    startingPlayers.remove(at: playerIndex)
    reservePlayers.remove(at: substituteIndex)

    // Add them to the other array
    startingPlayers.append(substitute)
    reservePlayers.append(player)

    return true
}

请注意,我还将 Team 更改为结构,并且 mutating 关键字用于告诉编译器我们正在更新结构。

我不太明白你所说的 return 错误是什么意思,所以我只是 return 一个布尔值。

作为额外的检查,您可以测试数组中是否存在每个玩家,我们将把它添加到