【问题标题】:Creating extension causes 'ErrorType' is not convertible to 'NSError'创建扩展会导致“ErrorType”无法转换为“NSError”
【发布时间】:2016-04-03 21:46:52
【问题描述】:

我一直在玩NSDecimalNumber,当我创建一个扩展时,突然间我收到了这个错误:

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

但是当我按照建议使用as! 时,我收到了警告:

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

最终改成as?给了我:

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

我创建的扩展是:

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

我应该如何制作这个扩展而不会收到这个烦人的警告/错误?

【问题讨论】:

  • 你试过 } catch let error as NSError { 而不是 dict[NSUnderlyingErrorKey] = error as NSError 吗?

标签: swift error-handling nsdecimalnumber


【解决方案1】:

这是答案,实际上信息非常清楚。 ErrorType 是一个空协议,它已被 NSError 采用。因此没有必要再次“守卫”或“如果让”它。你可以简单地说

let underlyingError = error as NSError

警告就会消失。

【讨论】:

    【解决方案2】:

    我不知道为什么仅仅因为您正在向String 添加扩展名而导致警告,但我们可以处理警告!

    作为this SO post answer suggests,我们可以这样做:

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

    关键因素是捕获错误,例如 catch let error as NSError

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2015-12-10
      • 2015-10-03
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多