xcode - 从 Swift 1 更新到 Swift 2

标签 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
    }
}

最佳答案

在这里,我让您的代码更漂亮、更安全。这段代码(理论上)无论发生什么都不会崩溃:

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

关于xcode - 从 Swift 1 更新到 Swift 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32847234/

相关文章:

iphone - 如何将非对象数据类型包装在 NSValue 对象中?

ios - iOS 上带有 Storyboard 的 TableView 导航栏中的返回、编辑和添加按钮

json - swift:无法使用存储的属性 'tableView' 覆盖

ios - iOS 中的 Swift 中使用 "locations array"或 "manager.location.coordinate"哪一个来获取用户位置?

ios - 尝试在重新排序已经在进行时开始对 Collection View 重新排序

ios - 将 Stripe Api 与 Swift IOS 和 Parse 后端一起使用

swift - Xcode 10.2 - 使用未声明的类型结果

iphone - UIScrollView objectAtIndex

xcode - OS X Mavericks 中 Xcode 5 中架构 x86_64 错误的 undefined symbol

ios - 快速返回另一页后, TableView 单元格正在复制