2016-04-03 9 views
2

私はNSDecimalNumberでプレーしてきたと私は拡張機能を作成したときに、突然のすべてが、私はこのエラーになった:の作成拡張の原因「ERRORTYPEは」への転換ではない「NSError」

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

をしかし、ときに私提案されたようas!使用し、私は警告を取得しています:

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

は、最終的にas?への変更は私を与えている:

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

私が作成した拡張機能は次のとおりです。

extension String { 

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

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

エラーが発生するコードは次のとおりです。

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

私は拡張子を変更すると、このエラーが消えてしまいます。

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

方法私はこの迷惑な警告/エラーを取得せずにこの拡張を行う必要がありますか?

+0

試しましたか?}} dict [NSUnderlyingErrorKey]の代わりにNSError {NSErrorとしてエラーを受け取りましたか? –

答えて

0

なぜあなたはStringに内線番号を追加しているという理由だけで警告を発しているのか分かりませんが、私たちは注意を払うことができます!

this SO post answer suggestsように、我々はこれを行うことができます:ここではcatch let error as NSError

1

回答があり、実際のメッセージは非常に明確であるように

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

主な要因は、キャッチエラーです。 ErrorTypeは空のプロトコルであり、NSErrorによって採用されています。したがって、それをもう一度「守る」、または「諦めさせる」必要はありません。あなたは簡単に言うことができます

let underlyingError = error as NSError 

警告は表示されません。

関連する問題