【问题标题】:'ErrorType' is not convertible to 'NSError''ErrorType' 不能转换为 'NSError'
【发布时间】:2026-01-12 17:45:01
【问题描述】:

我在使用 Google Analytics 时遇到了错误:

'ErrorType' 不能转换为 'NSError';你的意思是用'as!' 强制沮丧?

当我尝试调用 2 次 createScreenView 时会发生这种情况

我这样做:

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

错误所在的函数:

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

这里还有一个问题:

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

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

从 'NSMutableDictionary!' 强制转换到“[NSObject:AnyObject]” 总是成功;你的意思是用'as'吗?

变量“builder”从未发生变异;考虑改为“让” 常数

【问题讨论】:

  • 你实际上并没有捕捉到任何东西,试着纠正这样的事情:} catch let error = NSError { }
  • @Array 错误,当 'catch' 像这样单独使用时,它会自动生成一个 ErrorType 'error' 变量:你没有必须声明“catch let error作为 NSError”。 // 但是我也认为 ErrorType 转换似乎是 OP 的问题之一,但不是因为你给出的原因。 :)
  • @EricD。但是如果我只做一个 createScreenView 它工作

标签: ios swift google-analytics


【解决方案1】:

错误消息会告诉您问题并提出解决方案。 catch 块中的常量errorErrorType 类型,您想将其转换为NSError,这种转换可能不会成功。因此,您不能使用常规的 as 运算符,该运算符仅用于编译器可以判断的强制转换总是成功的。相反,您需要使用 as! 强制转换或使用 as? 进行安全转换。

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

对于您的第二个问题,您遇到了相反的问题。您正在使用 as! 运算符进行编译器知道将始终有效的强制转换。您应该只使用普通的 as 运算符。第三个问题是您要声明一个变量 (var),其值永远不会改变。在这些情况下,最好使用常量 (let)。

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

【讨论】:

  • ErrorType 类型的变量始终可以使用as NSError 进行转换。问题中提出的 persistentStoreCoordinator 方法是来自 Xcode 的标准模板代码,按原样编译。在这种情况下,不需要强制转换。
  • @MartinR 有趣,谢谢!不知道为什么 Ben 会得到编译器错误。可能是不同的 Swift 版本?
  • 有趣的是,对我来说,这个错误开始出现在开发过程中,在核心数据代码中,我什至在构建之间都没有触及。我之前多次“清理项目”都没有错误,之后,但错误继续出现。编译器只是停下来理解 Xcode 生成的代码。最后,我需要更改as 演员表。不知道它是什么,看起来是罕见的编译器错误。
【解决方案2】:

对我来说,在同一个项目中使用 AVFoundationCore Data 时也会发生这种情况。

摆脱错误:

'ErrorType' 不能转换为 'NSError';你的意思是用'as!'强制沮丧?

或警告:

从 'ErrorType' 到 'NSError' 的条件转换总是成功

从 'ErrorType' 强制转换为 'NSError' 总是成功的;你的意思是用'as'吗?

我这样做了:

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

希望这会有所帮助:)

【讨论】:

  • 花了很多时间来找到你所做的事情:最后是一个假 catch