2015-06-09 62 views
20

我剛下載的新的Xcode 7.0β和做了遷移從夫特1.2至夫特2.遷移顯然沒有改變整個代碼,實際上的方法saveContext(),它是細直到會因線2級的錯誤:夫特2遷移saveContext()中的appDelegate

if moc.hasChanges && !moc.save() { 

二進制運算符 '& &' 不能應用到兩個布爾操作數

呼叫可以扔掉,但是沒有打上「嘗試」和錯誤沒有被處理

的方法是這樣的:

// MARK: - Core Data Saving support 
func saveContext() { 
    if let moc = self.managedObjectContext { 
     var error: NSError? = nil 
     if moc.hasChanges && !moc.save() { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      NSLog("Unresolved error \(error), \(error!.userInfo)") 
      abort() 
     } 
    } 
} 

如何得到它的任何想法加工?

回答

33

首先您提供的兩個錯誤是誤導性的,但第二個發現的。問題出現在!moc.save()中,從Swift 2開始,不再返回Bool,而是註釋throws。這意味着你需要try這個方法和catch它可能發出的任何異常,而不是僅僅檢查它的返回值是真還是假。

爲了反映這一點,使用核心數據將產生以下樣板代碼可以代替你使用的代碼在Xcode 7中創建一個新的項目。

func saveContext() { 
    if managedObjectContext.hasChanges { 
     do { 
      try managedObjectContext.save() 
     } catch { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      let nserror = error as NSError 
      NSLog("Unresolved error \(nserror), \(nserror.userInfo)") 
      abort() 
     } 
    } 
} 
+1

謝謝你這是正確的答案,另外,你需要managedObjectContext後添加一個''太行的樣子:!!!'如果managedObjectContext .hasChanges {'和'嘗試managedObjectContext .save()' – kalafun

+0

@kalafun不,在Xcode 7中,managedObjectContext不是可選的。將在我的回答發佈更新 – Ian

+0

這很奇怪我正在使用xcode 7測試版,並且由於缺少感嘆號而引發錯誤。等待您的更新.. – kalafun

9

通過0x7FFFFFFF的答案是正確的,但要提高在蘋果公司的樣板代碼,你可以使用catch let error as NSError像這樣趕在catch塊的具體錯誤:

func saveContext() { 
    if managedObjectContext.hasChanges { 
     do { 
      try managedObjectContext.save() 
     } catch let error as NSError { 

      NSLog("Unresolved error \(error), \(error.userInfo)") 
      // Handle Error 
     } 
    } 
} 

最好的做法是使用該變種error女巫仍然可用,如果你只是使用這種方式:

func saveContext() { 
     if managedObjectContext.hasChanges { 
      do { 
       try managedObjectContext.save() 
      } catch { 
       NSLog("Unresolved error \(error), \(error.userInfo)") 
       // Handle Error 
      } 
     } 
    } 

以同樣的方式,如果你確信managedObjectContext.save()不會throwexception,代碼精簡下來到:

func saveContext() { 
    if managedObjectContext.hasChanges { 
     try! managedObjectContext.save() 
    } 
} 

而且對推斷爲什麼managedObjectContext不在斯威夫特2碼可選的,這是因爲NSManagedObject(concurrencyType:)是不會失敗的初始化。在Xcode 6中,如果NSPersistentStoreCoordinator爲零,則樣板代碼會返回可選的上下文,但您可以通過檢查輕鬆應對。

lazy var managedObjectContext: NSManagedObjectContext = { 
    let coordinator = self.persistentStoreCoordinator 
    var moc = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
    moc.persistentStoreCoordinator = coordinator 
    return moc 
}()