2016-09-15 26 views
6

Tôi đã đoạn mã sau mà tôi sử dụng để bỏ lưu trữ tập tin trong ứng dụng Mac của tôi:NSKeyedUnarchiver không làm việc với Swift 3

func tryOpen(_ filePath: String) throws -> NSArray { 
    if #available(OSX 10.11, *) { 
     do { 
      if let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)) { 
       let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as! NSArray 
       return array 
      } else { 
       throw NSError(domain: NSExceptionName.invalidUnarchiveOperationException.rawValue, code: 0, userInfo: nil) 
      } 
     } catch let ex { 
      throw ex 
     } 
    } else { 
     // Fallback on earlier versions 
     let dat = try? Data(contentsOf: URL(fileURLWithPath: filePath)) 
     let unarchiver = NSKeyedUnarchiver(forReadingWith: dat!) 
     if let array = unarchiver.decodeObject(forKey: "root") as? NSArray { 
      return array 
     } else { 
      throw NSException(name: NSExceptionName.invalidArgumentException, reason: "Unable to unarchive file", userInfo: nil) as! Error 
     } 
    } 
} 

Tuy nhiên, kể từ khi tôi nâng cấp lên Swift 3 trong Xcode 8.0, tôi đã như sau thông báo lỗi: 'unarchiveTopLevelObjectWithData' is unavailable in Swift: Use 'unarchiveTopLevelObjectWithData(_:) throws' instead, đó là khá nhiều điều tương tự, phải không? Vì vậy, tôi rất bối rối về cách sửa lỗi này. Đây có phải là lỗi trong Xcode không?

+3

Nó mong đợi một 'NSData': 'thử NSKeyedUnarchiver.unarchiveTopLevelObjectWithData (dữ liệu như NSData)' . Có vẻ như một cái gì đó vừa trượt qua các vết nứt trong API. – Rob

+0

Không có liên quan, nhưng bạn có thể đơn giản hóa điều này một chút: https://gist.github.com/robertmryan/73c19aaed3792723ba3e8c28960d94e2 – Rob

+0

@Rob, đó phải là câu trả lời không phải là nhận xét :) – Fawkes

Trả lời

6

Các NSKeyedUnarchiver vẫn mong đợi một NSData:

let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData) as! NSArray 

này đã được khắc phục trong Swift 4

+0

Cố định trong Swift 4! – Grifas