验证和交换元素 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 一个布尔值。
作为额外的检查,您可以测试数组中是否存在每个玩家,我们将把它添加到
对于初学者的问题和我糟糕的英语感到抱歉。
我需要在我的 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 一个布尔值。
作为额外的检查,您可以测试数组中是否存在每个玩家,我们将把它添加到