'ErrorType' is not convertible to 'NSError'

二次信任 提交于 2019-12-12 08:26:07

问题


I have an error with Google Analytics:

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

It happen when I'm trying to call 2 times createScreenView

I do this:

    override func viewDidLoad() {


        let tracker = GAI.sharedInstance().defaultTracker
        tracker.set(kGAIScreenName, value: "Demande Gratuite")

        var builder = GAIDictionaryBuilder.createScreenView().build() as! [NSObject : AnyObject]
        tracker.send(builder)
...
}

    @IBAction func Valider(sender: AnyObject) {
        ...
        let trackerv = GAI.sharedInstance().defaultTracker
        trackerv.set(kGAIScreenName, value: "Demande Envoyé")

        var builder = GAIDictionaryBuilder.createScreenView().build() as! [NSObject : AnyObject]
        trackerv.send(builder)


        let eventTracker: NSObject = GAIDictionaryBuilder.createItemWithTransactionId(
            "1",
            name: "test",
            sku: nil,
            category: "IOS",
            price: 1,
            quantity: 1,
            currencyCode: nil).build()
        trackerv.send(eventTracker as! [NSObject : AnyObject])
    }

Function where the error is:

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

Another problem here:

let tracker = GAI.sharedInstance().defaultTracker
tracker.set(kGAIScreenName, value: "Mentions Légales")

var builder = GAIDictionaryBuilder.createScreenView().build() as! [NSObject : AnyObject]
tracker.send(builder)

Forced cast from 'NSMutableDictionary!' to '[NSObject : AnyObject]' always succeeds; did you mean to use 'as'?

AND

Variable 'builder' was never mutated; consider changing to 'let' constant


回答1:


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 :)




回答2:


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]


来源:https://stackoverflow.com/questions/34722649/errortype-is-not-convertible-to-nserror

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!