2016-04-03 16 views
2

Ich habe mit NSDecimalNumber spielen und wenn ich eine Erweiterung geschaffen, ganz plötzlich war ich diesen Fehler:Erstellen Erweiterung Ursachen ‚Errortype‘ ist nicht konvertierbar ‚NSError‘

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

Aber als ich verwenden as! wie vorgeschlagen, ich bin die Warnung erhalten:

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

Wechsel Schließlich zu as? gibt mir:

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

Die Erweiterung I erstellt ist:

extension String { 

    var decimalValue: NSDecimalNumber? { 
     let number = NSDecimalNumber(string: self) 

     return number == NSDecimalNumber.notANumber() ? nil : number 
    } 
} 

Der Code, der den Fehler verursacht ist:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { 
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(self.storeFile) 
    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 { 
     var dict = [String: AnyObject]() 
     dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
     dict[NSLocalizedFailureReasonErrorKey] = failureReason 
---> dict[NSUnderlyingErrorKey] = error as NSError <--- 

     let error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 

     NSLog("Unresolved error \(error), \(error.userInfo)") 
     abort() 
    } 

    return coordinator 
}() 

Wenn ich ändern Sie die Erweiterung dieser Fehler verschwunden sein:

var decimalValue: NSDecimalNumber? { 
    return NSDecimalNumber(string: self) 
} 

Wie sollte ich diese Erweiterung machen, ohne diese nervige Warnung/Fehler zu bekommen?

+0

Haben Sie versucht} catch Let Fehler als NSError {statt dict [NSUnderlyingErrorKey] = Fehler als NSError? –

Antwort

0

Ich weiß nicht, warum es Warnung verursacht, nur weil Sie Erweiterung String hinzufügen, aber wir können uns um Warnung kümmern!

Als this SO post answer suggests, können wir dies tun:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { 
    .... 
    do { 
     try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil) 
    } catch let error as NSError { 
     .... 
     dict[NSUnderlyingErrorKey] = error 
     let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
     .... 
     NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)") 
     abort() 
    } catch { 
     // dummy 
    } 

    return coordinator 
}() 

Schlüsselfaktor ist Fangfehler wie catch let error as NSError

1

Hier ist die Antwort ist eigentlich die Botschaft ist sehr klar. Der ErrorType ist ein leeres Protokoll und wurde vom NSError übernommen. Daher muss man nicht "wachen" oder "wenn" es wieder zulassen. Sie können einfach sagen

let underlyingError = error as NSError 

Und die Warnung einfach verschwinden.