转换为斯威夫特3错误,可选的类型不解开

问题描述:

此代码与斯威夫特2书面的价值的工作,但不能与斯威夫特3.转换为斯威夫特3错误,可选的类型不解开

ShoppingManager.getShoppingItemsForPage(currentPage, pageSize: 40) { (shopItems: [ShopItemModel]?, error: Error?) ->() in 
     if error == nil { 

... 

self.shopItems.append(Array(shopItems[10..<40])) 

我得到一个错误

value of optional type [ShopItemModel] not unwrapped

我试过使用?但它不起作用。

这里是我的ShopItemModel

class ShopItemModel: NSObject { 
    //RestKitMapping 
    var itemID: String? 
    var shopName: String? 
+1

你在哪里尝试使用'?' ?至于我可以告诉这应该工作:self.shopItems?.append(Array(shopItems?[10 .. giorashc

+0

'shopItems?'产生一个类似的解包错误; '不能在非可选的ShopItemModel' \上使用可选的链接。没有?我得到; '可选类型的值ArraySlice ...''' – markhorrocks

+0

编译器想要解包'shopItems![10 .. vadian

展开使用guard let声明否则你可以强制拆开包装使用!但如果shopItems是零

guard let shopItemArray = shopItems else { 
    return // shopItems is nil if it goes here 
} 

self.shopItems.append(Array(shopItemArray[10..<40])) 
+0

这不适合我。我犯了同样的错误。 – markhorrocks

+0

'self.shopItems'的类型是什么? – Jeremy

+0

它是[ShopItemModel]类型,它是一个包含可选属性的NSObject。 – markhorrocks

这编译就会死机你shopItems:

ShoppingManager.getShoppingItemsForPage(currentPage, pageSize: 40) { (shopItems: [ShopItemModel]?, error: Error?) ->() in 
    if error == nil { 
     let lastItem = self.shopItems.count 

     if self.currentPage == 1 { 
      self.shopItems.append(contentsOf: Array(shopItems![10..<40])) 
     } else { 
      self.shopItems.append(contentsOf: Array(shopItems!)) 
     } 
+1

解开力并不是一个很好的做法,因为它可能导致崩溃,您应该使用'if let'或'guard let'语句来确保您的可选对象存在 – Jeremy