【问题标题】:Error Domain Handling in Swift 2Swift 2 中的错误域处理
【发布时间】:2016-08-02 06:07:52
【问题描述】:

我有以下来自 Swift 1.2 教程的代码,但我无法将其转换为 Swift 2:

var val: AnyObject? = self.value
var error: NSError?
if !self.myManangedObject.validateValue(&val, forKey: self.key, error: &error) {
    var message: String!
    if error?.domain == "NSCocoaErrorDomain" {
        var userInfo:NSDictionary? = error?.userInfo
        var errorKey = userInfo?.valueForKey("NSValidationErrorKey") as String
        var reason = error?.localizedFailureReason
        message = NSLocalizedString("Validation error on \(errorKey)\rFailure Reason:\(reason)", comment: "Validation error on \(errorKey)\rFailure Reason: \(reason)")
    } else {
        message = error?.localizedDescription
    }
    // Create some alerts with the message
}

第一行中的self.value 指的是CoreData 属性的值。

我知道我需要将代码更改为 do { try } catch { } 构造。我猜第 3 行应该是这样的:

try self.myManagedObject.validateValue(&val, forKey: self.key) 

但是,这不起作用,因为 Xcode 首先建议删除指针,然后说

"不能转换类型为 'AnyObject?' 的值到预期的参数类型 'AutoreleasingUnsafeMutablePointer (...)"

另外,我不确定如何处理 error?.domain 语句。通过搜索互联网,我发现的示例建议在枚举中处理错误类型,但我不明白这将如何应用在这里。

顺便说一句,是否可以使用当前版本的 Xcode 将此代码从 Swift 1.2 更新到 2.0?

【问题讨论】:

    标签: ios swift validation core-data error-handling


    【解决方案1】:

    以下是您尝试做的最小工作示例:

    var mgc : NSManagedObjectContext!
    var any : AnyObject?
    
    do {
        let valid = try mgc.validateValue(&any, forKey: "myKey")
        // branch based on the valid
    } catch let error as NSError {
        // here you go with your error handling
    }
    

    你能从这里拿走吗?

    【讨论】:

    • 谢谢,这实际上正是我自己设法实现的。问题是 &any 不会编译,就像我在问题中写的那样。在 catch-block 中,我假设我可以像在旧代码中一样检查错误域。编辑:我是个白痴,我使用的是 let 而不是 var,这就是指针无法编译的原因。
    • @MaxiMus 尝试清理构建和重建 - 我也遇到了编译问题。但这是正确的语法。
    • 谢谢,找到错误了。关于我的最后一个问题。如果我想让 Xcode(尝试)为我更新 Swift 1.2 代码,那么唯一的方法是安装 6.x 版本的 Xcode,在那里用 1.2 代码创建一个项目,然后用 7 打开它.x 版本?
    • @MaxiMus 我不这么认为 - 错误处理改变太多,无法轻松自动转换。我认为这些类型的更改必须由程序员自己执行,而不是通过自动 xcode 转换
    • 是的,我明白这一点。这只是一个技术问题,即使我会得到一个“错误”的转换,我也想看看 Xcode 的建议。
    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多