2017-08-17 89 views
0

我有一个空数组中的产品。当视图出现时有时出现异常,例如Terminating due to NSRangeExceptionIndex 0 beyond bounds for empty NSArray。我想有条件地检查数组的第一个值,但我没有一个适当的想法如何解决它。有人可以建议我如何解决这个问题。此代码位于视图控制器的ViewDidLoad上。NSRangeException。对于空的NSArray索引0超出界限

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 
    } 
}) 

有人建议如何在斯威夫特3解决这个问题?尝试访问阵列[0],查找空的NSArray

+0

做你检查的产品阵列不是零? –

回答

0

写这篇检查,如果你的产品阵列有任何产品

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

在此之前

if let product = products?[0] as? SKProduct { //getting exception in this line 
         let numberFormatter = NumberFormatter() 
+0

谢谢你的工作......... – MIOSY

+0

你也可以使用if let product = products?.first?如? SKProduct –

-1

请检查产品阵列的第一喜欢这个 如果(product.count> 0){ } OR if let productarray_obj = self.fetchedProducts {
}

-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)" 
} 

苹果公司说,大约卫队

卫队声明什么

的防护语句用来传送程序控制了范围 的如果一个或多个条件不符合。

的防护语句具有以下形式:

guard condition else { 

    statements 

} 
+0

Downvoted for。? –

+0

这种方法不起作用吗? –

0

的迅捷的方式来测试该条件是:

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

在一个表达该检查三个条件:

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

可以解决这类问题提供了安全标,它不会导致死机甚至你的索引出界,这里是代码:

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

你可以这样使用它: 'if let product = products?[safe:0] as? SKProduct' – Versus

相关问题