2016-09-15 133 views
6

我有我使用解除封存的文件在我的Mac應用程序下面的代碼:NSKeyedUnarchiver不是斯威夫特工作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 
     } 
    } 
} 

然而,自從我在Xcode 8.0升級到斯威夫特3,我有以下錯誤消息: 'unarchiveTopLevelObjectWithData' is unavailable in Swift: Use 'unarchiveTopLevelObjectWithData(_:) throws' instead,這是幾乎相同的東西,對不對?所以我很困惑如何解決這個問題。這是Xcode中的錯誤嗎?

+3

它期待'NSData':'嘗試NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(數據的NSData)' 。看起來像是剛剛滑過API中的裂縫。 – Rob

+0

無關,但你可以簡化這一點:https://gist.github.com/robertmryan/73c19aaed3792723ba3e8c28960d94e2 – Rob

+0

@Rob,這應該是一個回答,而不是一個評論:) – Fawkes

回答

6

NSKeyedUnarchiver仍然期待NSData

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

這在斯威夫特4得到糾正

+0

固定在Swift 4! – Grifas