Mik*_*ike 4 error-handling swift swift3
我有用于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
}
Run Code Online (Sandbox Code Playgroud)
上面的代码导致编译器错误:'&'只能立即出现在调用参数列表中.我已经尝试创建一个NSErrorPointer,所以我可以使用它,但我找不到任何关于如何初始化一个(类型别名声明是不够的).我已经使用Swift与Cocoa和Obj-C,它不包含单词NSErrorPointer,而是重复抛出错误的新方法.我还查看了几十个帖子都使用&err所以显然这是Swift 3的新功能.
那里有人解决了这个问题吗?使用NSErrorPointer的答案是什么?
谢谢,迈克
这似乎是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())
}
}
Run Code Online (Sandbox Code Playgroud)
在Xcode 8 beta 3附带的Swift 3中,NSErrorPointer可选:
public typealias NSErrorPointer = AutoreleasingUnsafeMutablePointer<NSError?>?
Run Code Online (Sandbox Code Playgroud)
作为结果
因此,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())
}
}
Run Code Online (Sandbox Code Playgroud)
然后你的代码编译并按预期运行.
| 归档时间: |
|
| 查看次数: |
2955 次 |
| 最近记录: |