我在Swift和Xcode的早期版本中编写了这段代码,现在当我将xcode更新为7.0.1并将swift更新为另一版本时,我遇到了很多错误。这是我无法解决的问题,如果你能帮助我,那就太好了。胖文本是错误。来自>>>的部分至<<<是我需要帮助的部分所以>和<不是真正的代码。
extension SKNode {
class func unarchiveFromFile(file : String) -> SKNode? {
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
>>> var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)! <<<
var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameScene
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
答案 0 :(得分:3)
在这里,我使您的代码更好,更安全。这个代码(理论上)无论发生什么都不会崩溃:
extension SKNode {
class func unarchiveFromFile(file : String) -> SKNode? {
guard let
path = NSBundle.mainBundle().pathForResource(file, ofType: "sks"),
sceneData = try? NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe) else {
return nil
}
let archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
guard let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as? GameScene else {
return nil
}
archiver.finishDecoding()
return scene
}
}
如果您不知道新错误处理和guard
的工作原理,请在线查看。
此外,如果你真的想要花哨,你可以使用新的defer
:
extension SKNode {
class func unarchiveFromFile(file : String) -> SKNode? {
guard let
path = NSBundle.mainBundle().pathForResource(file, ofType: "sks"),
sceneData = try? NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe) else {
return nil
}
let archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
defer { archiver.finishDecoding() }
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
return archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as? GameScene
}
}
答案 1 :(得分:1)
在swift 2.0中,您必须管理抛出的错误:
do {
var sceneData = try NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe)
} catch let error as NSError {
// manage error case
}
答案 2 :(得分:0)
不再有NSData.init(contentsOfFile:options:error:)
构造函数。以这种方式返回错误的大多数Cocoa调用现在正在抛出。做你在这里所做的新方法是:
var sceneData = try! NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe)
这不是取回一个可选的,然后强制展开它,而是使用force-try来做同样的事情。在这两种情况下,如果读取失败,这将崩溃。通常情况下,try
内部的正常do/catch
是首选(就像您通常不应强制解包选项一样)。
答案 3 :(得分:-1)
您需要下载新版本的Swift语言书。由应该组合的位组成的枚举现在表示为集合,而不是整数值。在Apple的文档中,一切都很好地解释了。
阅读发行说明也非常非常有用。在这个时间点上,Apple没有任何顾忌以破坏现有代码的方式修改语言。你需要自己跟上它。