'ErrorType' is not convertible to 'NSError' 'ErrorType' is not convertible to 'NSError' swift swift

'ErrorType' is not convertible to 'NSError'


For me, this also happens when using AVFoundation and Core Data in the same project.

To get rid of the error:

'ErrorType' is not convertible to 'NSError'; did you mean to use 'as!' to force downcast?

Or the warnings:

Conditional cast from 'ErrorType' to 'NSError' always succeeds

Forced cast from 'ErrorType' to 'NSError' always succeeds; did you mean to use 'as'?

I did this:

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("MY_APP_NAME.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 let error as NSError {        // 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        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()    } catch {        // dummy    }        return coordinator}()

Hope this helps :)


The error message tells you the issue and suggests a solution. The constant error in the catch block is of type ErrorType, and you want to cast it to NSError, a cast which may not succeed. Therefore you cannot use the regular as operator which is only for casts that the compiler can tell will always succeed. Instead you either need to use as! to force-cast or as? to do a safe-cast.

catch {        // Report any error we got.        var dict = [String: AnyObject]()        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"        dict[NSLocalizedFailureReasonErrorKey] = failureReason        if let underlyingError = error as? NSError {            dict[NSUnderlyingErrorKey] = underlyingError        }        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()    }

For your second issue, you have the opposite problem. You are using the as! operator for a cast that the compiler knows will always work. You should just use the plain as operator. And the third issue is that you are declaring a variable (var) whose value you never change. In those cases, using a constant (let) is preferred.

let builder = GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject]