数组中的致命错误-索引超出范围

时间:2018-08-03 09:44:37

标签: ios swift

我有此代码:

func getSelectedProductToCalc(countedProduct: [CountedProduct], index: Int)->Products?{
        let products = ((parent as! CallculatorViewController).parent as! MainViewControler).productsObjectArray
        if countedProduct[index].productCode != nil{
            if (products.count > 0 ){
                for cProduct in products {
                    if cProduct.code == countedProduct[index].productCode{
                        return cProduct
                        break
                    }
                }
            }
            usedCalculatorLimit = products.count
            showAvailableProductPosition()
        }
        return nil
    }

我在下面的行有错误:

if countedProduct[index].productCode != nil{

  
      
  • 线程1:致命错误:索引超出范围
  •   

在应用程序开始时,我不知道数组(索引)的大小。我该如何防止显示错误? 如果我在表中没有必要的元素,我想这样做:print(“ empty!”)

已更新

好,我将任何代码更新为:

func getSelectedProductToCalc(countedProduct: [CountedProduct], index: Int)->Products?{
        let products = ((parent as! CallculatorViewController).parent as! MainViewControler).productsObjectArray

        if index < countedProduct.count && countedProduct[index].productCode != "" {
            if (products.count > 0 ){
                for cProduct in products {
                    if cProduct.code == countedProduct[index].productCode{
                        return cProduct
                    }
                }
            }
            usedCalculatorLimit = products.count
            showAvailableProductPosition()
        }
        return nil
    }

现在,当我运行我的函数时:

let product: Products = getSelectedProductToCalc(countedProduct: countedProductArray, index: 2)!

我有错误:线程1:致命错误:展开一个可选值时意外发现nil

您如何保护它?

3 个答案:

答案 0 :(得分:1)

在对具有索引检查索引的数组进行下标之前,不会超出数组的范围。因此,只需在条件中添加一个条件即可。

if index < countedProduct.count && countedProduct[index].productCode != nil {
    //Your code
}

建议:-还要检查数组是否为空或不使用isEmpty bool属性。

答案 1 :(得分:1)

回答问题的第一部分。只需添加条件即可检查索引是否在您的计数之内。

if index < countedProduct.count && countedProduct[index].productCode != "" {
    //Do Something
}

您的结果也应该是可选的,或者应该安全地包装函数结果。

let product: Products? = getSelectedProductToCalc(countedProduct: countedProductArray, index: 2)

guard let product: Products = getSelectedProductToCalc(countedProduct: countedProductArray, index: 2) else {
    print("no products")
    return
}

答案 2 :(得分:0)

显示此错误是因为您试图访问数组数据以外的数组值。

因此,您需要检查一下,该索引应始终小于数组计数。

只需在方法的第一行添加以下代码:

guard index < countedProduct.count else { return nil }

希望这会对您有所帮助。 :)