“ErrorType”不能转换为“NSError”

我在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”?

variables“build造者”从来没有变异; 考虑改变为“让”不变

对我来说,在同一个项目中使用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 }() 

希望这可以帮助 :)

错误消息告诉你这个问题,并build议一个解决scheme。 catch块中的常量error的types是ErrorType ,并且你想把它转换成NSError ,这个转换可能不会成功。 因此,你不能使用只有编译器能够告诉的转换才能成功的常规运算符。 相反,你要么使用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! 编译器知道的转换操作符将始终工作。 你应该只使用plain as运算符。 第三个问题是你正在声明一个variables( var ),它的值永远不会改变。 在这些情况下,使用常数( let )是首选。

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