【问题标题】:Swift 3 change to NSErrorPointer?Swift 3 更改为 NSErrorPointer?
【发布时间】:2016-11-29 13:07:41
【问题描述】:

我有用于 SwiftyJSON 的代码,我正在尝试使用 XCode 8.0 Beta 3 更新到 Swift 3。我遇到了编译器不喜欢参数“错误:&err”的问题和以前一样。我一直在寻找如何正确传递 NSErrorPointer 但我发现的所有内容都说要重写,忽略错误并返回错误。由于这不是我的代码,我宁愿保持原样。那么使用 NSErrorPointer 的正确新方法是什么?

var err : NSError?
// code to get jsonData from file
let json = JSON(data: jsonData, options: JSONSerialization.ReadingOptions.allowFragments, error: &err)
if err != nil {
   // do something with the error
} else {
    return json
}

上面的代码导致编译器错误:'&' 只能立即出现在调用参数列表中。我已经尝试创建一个 NSErrorPointer 所以我可以使用它,但我找不到任何关于如何初始化的内容(类型别名声明是不够的)。我已经去过Using Swift with Cocoa and Obj-C,它不包含 NSErrorPointer 这个词,而是介绍了抛出错误的新方法。我还查看了几十篇使用 &err 的帖子,所以显然这是 Swift 3 的新内容。

有没有人解决了这个问题?使用 NSErrorPointer 的答案是什么?

谢谢, 迈克

【问题讨论】:

    标签: swift error-handling swift3


    【解决方案1】:

    这似乎是 SwiftyJSON 的 Swift 3 分支中的错误

    将init方法定义为

    public init(data:Data, options opt: JSONSerialization.ReadingOptions = .allowFragments, error: NSErrorPointer? = nil) {
        do {
            let object: AnyObject = try JSONSerialization.jsonObject(with: data, options: opt)
            self.init(object)
        } catch let aError as NSError {
            if error != nil {
                error??.pointee = aError
            }
            self.init(NSNull())
        }
    }
    

    在 Xcode 8 beta 3 附带的 Swift 3 中,NSErrorPointer 是可选的:

    public typealias NSErrorPointer = AutoreleasingUnsafeMutablePointer<NSError?>?
    

    由于

    因此error 参数应该具有NSErrorPointer 类型, 不是NSErrorPointer?(因此是error??.pointee 更改为error?.pointee)。 通过这些更改,init 方法变为

    public init(data:Data, options opt: JSONSerialization.ReadingOptions = .allowFragments, error: NSErrorPointer = nil) {
        do {
            let object: AnyObject = try JSONSerialization.jsonObject(with: data, options: opt)
            self.init(object)
        } catch let aError as NSError {
            if error != nil {
                error?.pointee = aError
            }
            self.init(NSNull())
        }
    }
    

    然后您的代码将按预期编译和运行。

    【讨论】:

    • 非常感谢答案中的详细信息。看起来 SwiftyJSON 重复了 SE-0055 中通过更改类型别名所做的工作。
    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多