2016-07-26 40 views
3

我有代码我一直在使用SwiftyJSON,我试图更新到Swift 3使用XCode 8.0 Beta 3.我遇到了一个问题,其中编译器不喜欢参数的错误:& err'像以前一样。我一直在寻找如何正确传递一个NSErrorPointer,但是我发现的所有东西都说要重写,忽略错误并抛出一个错误。由于这不是我的代码,我宁愿保留原样。那么使用NSErrorPointer的正确新方法是什么?Swift 3更改为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的答案是什么?

谢谢, 麦克

回答

7

这似乎是在SwiftyJSON的夫特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()) 
    } 
} 

在迅速3附带的Xcode 8个β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()) 
    } 
} 

,然后你的代码编译并运行正常。

+0

非常感谢答案中的细节。看起来像SwiftyJSON重复了SE-0055中所做的工作,这些工作是通过更改类型别名完成的。 – Mikey