NSKeyedUnarchiver 不适用于 Swift 3
Posted
技术标签:
【中文标题】NSKeyedUnarchiver 不适用于 Swift 3【英文标题】:NSKeyedUnarchiver not working with Swift 3 【发布时间】:2017-01-24 01:03:30 【问题描述】:我有以下代码用于在我的 Mac 应用程序中解压缩文件:
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 中升级到 Swift 3 后,我收到了以下错误消息:
'unarchiveTopLevelObjectWithData' is unavailable in Swift: Use 'unarchiveTopLevelObjectWithData(_:) throws' instead
,这几乎是一回事,对吧?所以我对如何解决这个问题感到非常困惑。这是 Xcode 中的错误吗?
【问题讨论】:
期待NSData
: try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData)
。看起来有些东西刚刚从 API 的裂缝中溜走了。
不相关,但您可以稍微简化一下:gist.github.com/robertmryan/73c19aaed3792723ba3e8c28960d94e2
@Rob,这应该是一个答案而不是评论:)
【参考方案1】:
NSKeyedUnarchiver
仍然期待 NSData
:
let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData) as! NSArray
这已在 Swift 4 中得到解决
【讨论】:
在 Swift 4 中修复!以上是关于NSKeyedUnarchiver 不适用于 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章
NSKeyedUnarchiver.unarchiveObject 不工作 [重复]