Swift 2.0迁移错误

Mar*_*k L 4 ios swift swift2

我已经看过WWDC会议,阅读关于Swift的新程序员的书,并阅读我可以找到的Stack Overflow上的所有相关问题.从Swift 1.2迁移到Swift 2.0后,我修复了我的应用程序中的大多数错误.

然而,还有一些我无法解决的问题.

向下转向AnyObject

错误:

无法从'[AnyObject]'向下转换为更可选的类型'[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)")
    }
Run Code Online (Sandbox Code Playgroud)

显示的错误发生在该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
}()
Run Code Online (Sandbox Code Playgroud)

我没有触及上面的代码.所以我不知道为什么苹果的迁移工具没有正确迁移它.

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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我再也没有触及AppDelegate的这一部分,也不确定上面的代码究竟出了什么问题.

Tal*_*ion 9

似乎AppDelegate上的CoreData存在严重的Swift 2迁移问题.我能够通过将AppDelegate CoreData Swift 1.2完全替换为Swift 2.0来解决问题.

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

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {

lazy var managedObjectContext: NSManagedObjectContext = {

// MARK: - Core Data Saving support

func saveContext ()
Run Code Online (Sandbox Code Playgroud)

并粘贴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()
         }
     }
 }
}
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题.