Swift 2.0迁移错误

我已经观看了WWDC会议,阅读了关于Swift的新程序员,并阅读了Stack Overflow的所有相关问题。 从Swift 1.2迁移到Swift 2.0后,我修复了大部分错误。

但是还有一些我还没有设法解决。

Downcasting AnyObject

错误:

无法从“[AnyObject]”下降到更多可选types“[NSManagedObject]”

码:

let fetchRequest = NSFetchRequest(entityName: formulaEntity) var error: NSError? do { let fetchedResults = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]? if let results = fetchedResults { stocks = results } else { print("Could not fetch \(error), \(error!.userInfo)") } } catch { print("ERROR: \(error)") } 

显示的错误发生在let fetchedResults = try...行中

另一个奇怪的错误是在我的AppDelegate:

错误:

'NSMutableDictionary'不能转换为'[NSObject:AnyObject]'

码:

  lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. // Create the coordinator and store var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("Stocks.sqlite") var error: NSError? = nil var failureReason = "There was an error creating or loading the application's saved data." do { try coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil) } catch var error1 as NSError { error = error1 coordinator = nil // Report any error we got. let dict = NSMutableDictionary() dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" dict[NSLocalizedFailureReasonErrorKey] = failureReason dict[NSUnderlyingErrorKey] = error error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict as [NSObject : AnyObject]) // Replace this 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() } catch { fatalError() } return coordinator }() 

我还没有碰过上面的代码。 所以我不知道为什么这不是由苹果的移植工具正确迁移。

在我的AppDelegate的另一个错误:

二元运算符'&&'不能应用于两个Bool操作数

调用可以抛出,但没有用“try”标记,并且不处理错误。

码:

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

再次,我没有触及AppDelegate的这一部分,不知道上面的代码究竟是什么问题。

无法从“[AnyObject]”下降到更多可选types“[NSManagedObject]”

在Swift 1.2中, executeFetchRequest(:_)返回了[AnyObject]? 。 在Swift 2中,它返回[AnyObject]因为新的try …语法返回一个非可选的。

(在该方法返回nil的情况下,该方法根本不会返回,并且控件将移动到catch块。)


'NSMutableDictionary'不能转换为'[NSObject:AnyObject]'

这意味着你正试图插入一个NSMutableDictionary ,不能转换为Objective-C对象。 在你的情况,我认为这是因为error是一个符合ErrorType的结构,而不是一个NSError对象。 尝试添加error1来代替。


调用可以抛出,但没有用“try”标记,并且不处理错误。

save()可能会抛出一个错误,所以需要用try来执行,而不是作为一个bool来计算。 正如Martin R.在评论中指出的那样, 这个问题的答案提供了一个完整的解决scheme,所以我不会在这里重复一遍。

看来在AppDelegate上CoreData存在一个严重的Swift 2迁移问题。 我能够通过完全replaceAppDelegate CoreData Swift 1.2到Swift 2.0来解决这个问题。

你需要做的是删除以下内容

 lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { lazy var managedObjectContext: NSManagedObjectContext = { // MARK: - Core Data Saving support func saveContext () 

并粘贴Swift 2.0代码:

 lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. // Create the coordinator and store let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite") var failureReason = "There was an error creating or loading the application's saved data." do { try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil) } catch { // Report any error we got. var dict = [String: AnyObject]() dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" dict[NSLocalizedFailureReasonErrorKey] = failureReason dict[NSUnderlyingErrorKey] = error as NSError let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) // Replace this 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 \(wrappedError), \(wrappedError.userInfo)") abort() } return coordinator }() lazy var managedObjectContext: NSManagedObjectContext = { // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. let coordinator = self.persistentStoreCoordinator var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) managedObjectContext.persistentStoreCoordinator = coordinator return managedObjectContext }() // MARK: - Core Data Saving support 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() } } } } 

这应该解决这个问题。