使用起始索引搜索数组中的对象

时间:2016-10-10 15:43:05

标签: ios arrays swift

我遍历一个数组,每次找到一个类别等于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)

中崩溃

2 个答案:

答案 0 :(得分:1)

循环条件在两种情况下结束迭代:

  • t[index].category1 时 - 您正在寻找这种情况,而您的代码正在处理它。
  • 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。