2016-12-01 20 views
2

此代碼與斯威夫特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 .. <40])) – giorashc

+0

'shopItems?'產生一個類似的解包錯誤; '不能在非可選的ShopItemModel' \上使用可選的鏈接。沒有?我得到; '可選類型的值ArraySlice ...''' – markhorrocks

+0

編譯器想要解包'shopItems![10 .. <40]'。考慮爲返回的項目使用不同的名稱以避免名稱衝突。 – vadian

回答

0

展開使用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

0

這編譯就會死機你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