NSRangeException。对于超出边界的空NSArray索引0

时间:2017-08-17 07:08:42

标签: ios swift

我的产品是空数组。当视图出现时,它有时会提供例外,例如Terminating due to NSRangeExceptionIndex 0 beyond bounds for empty NSArray。我想有条件地检查数组的第一个值,但我不知道如何解决它。有人可以建议我如何解决这个问题。此代码位于视图控制器的ViewDidLoad上。

enter image description here

MCIAPHelper.sharedInstance.requestProductsWithCompletionHandler({ (success, products) -> () in
    if success {
        NSLog("\(String(describing: products?.count)) product count")
        self.fetchedProducts = products as? [SKProduct]
        NSLog("\(self.fetchedProducts.count) fetched product")
        if let product = products?[0] as? SKProduct {    //getting exception in this line
            let numberFormatter = NumberFormatter()
            numberFormatter.formatterBehavior = NumberFormatter.Behavior.behavior10_4
            numberFormatter.numberStyle = NumberFormatter.Style.currency
            numberFormatter.locale = product.priceLocale
            if let productPrice = numberFormatter.string(from: product.price) {
                self.purchaseFullVersionSubtitle.text = "Use this app forever for only \(productPrice)"
            }
        }
    } else {
        //TODO: Error Handling
    }
})

有人可以建议如何在Swift 3中解决这个问题吗?尝试访问数组[0]以查找空的NSArray

5 个答案:

答案 0 :(得分:0)

写这个以检查您的产品阵列是否有任何产品

ProxyPass  /login  http://127.0.0.1:8080/login/ retry=0

之前

if products != nil && products!.count > 0

答案 1 :(得分:0)

测试这种情况的Swift方法是:

if let product = products?.first as? SKProduct {
    ....
}

这将检查一个表达式中的三个条件:

  1. products是非零吗?
  2. 产品中是否至少有一个元素?
  3. SKProduct类型的第一个元素吗?

答案 2 :(得分:0)

你可以使用安全的下标解决这类问题,即使你的索引超出范围也不会导致崩溃,这里是代码:

extension Collection {
    subscript(safe index: Index) -> Generator.Element? {
        return index >= startIndex && index < endIndex ? self[index] : nil
    }
}

答案 3 :(得分:-1)

请首先检查产品阵列 if(product.count&gt; 0){ } 要么 如果让productarray_obj = self.fetchedProducts {
}

答案 4 :(得分:-1)

您可以使用警卫解决问题

guard let product = products?[0] as? SKProduct else {
    print("Something went wrong")
    return
}

let numberFormatter = NumberFormatter()
numberFormatter.formatterBehavior = NumberFormatter.Behavior.behavior10_4
numberFormatter.numberStyle = NumberFormatter.Style.currency
numberFormatter.locale = product.priceLocale

if let productPrice = numberFormatter.string(from: product.price) {
    self.purchaseFullVersionSubtitle.text = "Use this app forever for only \(productPrice)"
}

Apple对Guard的评价

  

警卫声明

     

guard语句用于将程序控制转移到范围之外   如果不满足一个或多个条件。

     

警卫声明的格式如下:

guard condition else {

    statements

}