2016-07-26 148 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