Swift 3中更改为NSErrorPointer?

4

我有一些使用SwiftyJSON的代码,现在我想升级到Swift 3,并使用XCode 8.0 Beta 3。但是我遇到了一个问题,编译器不喜欢以前的'error: &err'参数。我一直在寻找正确传递NSErrorPointer的方式,但是所有的信息都说要重写代码,略去error并抛出错误。因为这不是我的代码,所以我宁愿保留原样。那么使用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,以便我可以使用它,但我找不到任何关于如何初始化它的信息(类型别名声明不足够)。我已经查看了《使用Swift与Cocoa和Obj-C》,它没有包含“NSErrorPointer”这个词,而是介绍了一种新的报错方式。我也查看了几十篇文章,所有这些文章都使用“&err”,因此这个问题似乎是Swift 3中新增加的。

有人解决过这个问题吗?如何使用NSErrorPointer?

谢谢, Mike

1个回答

7

这似乎是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中概述的努力,这是通过更改类型别名完成的。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接