从Swift 1更新到Swift 2

时间:2015-09-29 14:53:22

标签: xcode swift

我在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
    }
}

}

4 个答案:

答案 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没有任何顾忌以破坏现有代码的方式修改语言。你需要自己跟上它。