我有此代码:
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
您如何保护它?
答案 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 }
希望这会对您有所帮助。 :)