我遍历一个数组,每次找到一个类别等于1的对象时,我想检查该类别的数组的 rest 中是否有另一个对象。我写了这个方法
func getNextIndex(startIndex:Int , t : [Client]) -> Int{
var index = startIndex
while(index < t.count && Int(t[index].category!) != 1){
index += 1
}
if(t[index].category == 1){
return index
}else{
return -1
}
}
此返回始终与我用于调用方法的索引相同。如果我使用索引+ 1调用它,应用程序会在行if(t[index].category == 1)
答案 0 :(得分:1)
循环条件在两种情况下结束迭代:
t[index].category
为1
时 - 您正在寻找这种情况,而您的代码正在处理它。index
到达数组的末尾时 - 这是找不到所需项目的情况;您的代码无法处理此情况,这就是您的应用崩溃的原因。要解决此问题,并在当前索引之后查找项目,请按如下所示更改代码:
func getNextIndex(startIndex:Int , t : [Client]) -> Int {
var index = startIndex
while(index < t.count && Int(t[index].category!) != 1){
index += 1
}
if index == t.count {
return -1
}
// Otherwise, category is 1. Continue searching
while(index < t.count && Int(t[index].category!) != 1){
index += 1
}
return index != t.count ? index : -1
}
答案 1 :(得分:1)
您描述的行为正是人们对此代码的期望。
当你退出&#34;而#34;循环,要么你发现另一个条目或索引已经通过了数组的末尾。后一种情况是导致崩溃的原因。
有很多方法可以对此进行编码,但为了使代码大致相同,在循环之后,只需测试index是否小于t.count。如果是,你找到了你要找的东西,返回索引。如果没有,那么你已经完成了整个循环而没有找到你要找的东西,所以返回-1。