Swift:在这种情况下如何防止索引超出范围
Swift: How can I prevent a Index out of range in this instance
我有一个应用程序,其中包含存储在 CoreData 中的玩家列表(最多 21 个)。当 ViewController 加载时,它会在主屏幕的按钮上显示玩家姓名。
但是,我已经为用户提供了删除播放器的功能,因为 21 个对于他们的设置来说可能太多了。所以他们删除了,这会按预期从 CoreData 中删除数据。
然后他们刷新 ViewController,我只想显示仍在 CoreData 中的玩家数量的按钮。
所以我使用了这段代码:-
func reset()
{
let ksPickButtons = view.subviews.filter{[=11=] is KSPickButton}
ksPickButtons.forEach{[=11=].removeFromSuperview()}
//sort the player list
allPlayers.sort()
playerNo = 0
//run 2 loops to display the buttons (21 of them)
for j in 0...2 {
for i in 0...6 {
//use the CLASS KSPIckButton to format the buttons
let buttonOne:UIButton = KSPickButton(frame: CGRect(x: (j + 1) * 35 + (j * 80), y: (i + 5) * 35 + buttonSet, width: 110, height: 30))
//Add the button to the storyboard
self.view.addSubview(buttonOne)
buttonOne.addTarget(self,
action: #selector(playerButtons),
for: .touchUpInside)
//assign the tag to the button
buttonOne.tag = playerNo
//Give the buttons the players names
buttonOne.setTitle(allPlayers[playerNo], for: .normal)
playerNo += 1
}
}
initStart()
}
但是这一行
buttonOne.setTitle(allPlayers[playerNo], for: .normal)
给我一个致命错误:"Index out of Range" 因为不再有 21 个项目,我的循环会将 playerNo 增加到 21。
我尝试了 "IF" 语句,但在编译时它们被忽略了,并且 "Index out of Range" 仍然停止代码执行。
如何识别/停止/跳过错误,只显示播放人数的按钮数?
谢谢
在设置标题之前使用 if 语句。
if allPlayers.count < playerNo {
buttonOne.setTitle(allPlayers[playerNo], for: .normal)
}
然而,这只会阻止 "Index out of Range" 而不会改善实际逻辑。 Post 完整的代码,以便完整的逻辑是可以理解的。
let isIndexValid = array.indices.contains(index)
if isIndexValid == true
{
buttonOne.setTitle(allPlayers[playerNo], for: .normal)
}
else
{
//do nothing
}
这会起作用。
我有一个应用程序,其中包含存储在 CoreData 中的玩家列表(最多 21 个)。当 ViewController 加载时,它会在主屏幕的按钮上显示玩家姓名。
但是,我已经为用户提供了删除播放器的功能,因为 21 个对于他们的设置来说可能太多了。所以他们删除了,这会按预期从 CoreData 中删除数据。
然后他们刷新 ViewController,我只想显示仍在 CoreData 中的玩家数量的按钮。
所以我使用了这段代码:-
func reset()
{
let ksPickButtons = view.subviews.filter{[=11=] is KSPickButton}
ksPickButtons.forEach{[=11=].removeFromSuperview()}
//sort the player list
allPlayers.sort()
playerNo = 0
//run 2 loops to display the buttons (21 of them)
for j in 0...2 {
for i in 0...6 {
//use the CLASS KSPIckButton to format the buttons
let buttonOne:UIButton = KSPickButton(frame: CGRect(x: (j + 1) * 35 + (j * 80), y: (i + 5) * 35 + buttonSet, width: 110, height: 30))
//Add the button to the storyboard
self.view.addSubview(buttonOne)
buttonOne.addTarget(self,
action: #selector(playerButtons),
for: .touchUpInside)
//assign the tag to the button
buttonOne.tag = playerNo
//Give the buttons the players names
buttonOne.setTitle(allPlayers[playerNo], for: .normal)
playerNo += 1
}
}
initStart()
}
但是这一行
buttonOne.setTitle(allPlayers[playerNo], for: .normal)
给我一个致命错误:"Index out of Range" 因为不再有 21 个项目,我的循环会将 playerNo 增加到 21。
我尝试了 "IF" 语句,但在编译时它们被忽略了,并且 "Index out of Range" 仍然停止代码执行。
如何识别/停止/跳过错误,只显示播放人数的按钮数?
谢谢
在设置标题之前使用 if 语句。
if allPlayers.count < playerNo {
buttonOne.setTitle(allPlayers[playerNo], for: .normal)
}
然而,这只会阻止 "Index out of Range" 而不会改善实际逻辑。 Post 完整的代码,以便完整的逻辑是可以理解的。
let isIndexValid = array.indices.contains(index)
if isIndexValid == true
{
buttonOne.setTitle(allPlayers[playerNo], for: .normal)
}
else
{
//do nothing
}
这会起作用。