2016-01-11 6 views
9

ho un errore con Google Analytics:'ERRORE.TIPO' non è convertibile in 'NSError'

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

accadere quando sto cercando di chiamare 2 volte createScreenView

faccio questo:

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

Funzione dove l'errore è:

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

Un altro problema qui:

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'?

E

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

+0

Sei non prendere nulla in realtà, prova a destra qualcosa come: } catch let error = NSError { } – Array

+0

@Array Wrong, quando 'catch' viene usato da solo in questo modo, genera automaticamente una variabile 'error' ErrorType: non devi * avere * per dichiarare "catch let errore come NSError ". // Tuttavia penso anche che il cast di ErrorType sembra essere uno dei problemi dell'OP, ma non per il motivo che offri. :) – Moritz

+0

@EricD. Ma se faccio solo uno createScreenView funziona – Ben

risposta

15

Per me, questo accade anche quando si utilizza AVFoundation e Core Data nello stesso progetto.

per sbarazzarsi di l'errore:

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

o gli avvisi:

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

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

ho fatto questo:

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

Spero che questo aiuti :)

+7

Abbiamo passato molto tempo a trovare quello che hai fatto: un manichino "cattura" alla fine. –

1

Il messaggio di errore indica il problema e suggerisce una soluzione. La costante error nel blocco catch è di tipo ErrorType e si desidera eseguire il cast su NSError, un cast che potrebbe non riuscire. Pertanto non è possibile utilizzare l'operatore regolare as che è solo per i cast che il compilatore è in grado di riconoscere avrà sempre successo. Invece devi usare as! per forzare il cast o as? per fare un cast sicuro.

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

Per il tuo secondo problema, hai il problema opposto. Si sta utilizzando l'operatore as! per un cast che il compilatore sa che funzionerà sempre. Dovresti semplicemente usare l'operatore normale as. E il terzo problema è che stai dichiarando una variabile (var) il cui valore non cambi mai. In questi casi, è preferibile utilizzare una costante (let).

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

Una variabile di tipo 'ErrorType' può sempre essere convertita con' as NSError'. Il metodo persistentStoreCoordinator come presentato nella domanda è codice di modello standard da Xcode e * viene compilato come è *. In questo caso non è necessario un cast opzionale. –

+0

@MartinR Interessante, grazie! Non sono sicuro del perché Ben stia ottenendo l'errore del compilatore. Forse una versione diversa di Swift? –

+0

È interessante notare che questo errore ha iniziato a comparire proprio nel bel mezzo dello sviluppo, nel codice di Core Data che non ho nemmeno toccato tra le build. Ho fatto "Clean project" molte volte prima senza errori, e dopo, ma l'errore ha continuato ad apparire. Il compilatore si è appena fermato per capire il codice generato da Xcode. Alla fine, dovevo cambiare il cast di 'as'. Non ha idea di cosa fosse, sembra un raro bug di compilatore. – Cemen