无法在Swift中解码NSObject

时间:2014-09-21 00:04:45

标签: swift nscoding

我在Swift中编码后解码对象时遇到问题。

这是我的班级:

class Player: NSObject, NSCoding {

    var score:Int = 0

init(difficulty: Int!) {
    super.init()

}


required init(coder aDecoder: NSCoder) {
    score = aDecoder.decodeObjectForKey("score") as Int
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(score, forKey: "score")
} 

这是我编码和解码的时候:

let data = NSKeyedArchiver.archivedDataWithRootObject(player)
let newPlayer = NSKeyedUnarchiver.unarchiveObjectWithData(data) as Player

每次尝试取消归档时都会崩溃。有人有什么理由吗?

P.S。我不知道为什么我的代码没有格式化。我把它缩进了4个空格!对不起!

3 个答案:

答案 0 :(得分:1)

以下是我为实现目标所做的工作:

  1. 在我的App Delegate
  2. 中创建了一个播放器实例
  3. 如果你的应用程序是UIApplication.sharedApplication()。player
  4. ,你可以在任何地方调用它

答案 1 :(得分:0)

这应该有效。如果你想保存一组Player对象,我会发一个单独的答案。

两个NSObject类:

import Foundation

class Player: NSObject {

    var score:Int = 0

    func encodeWithCoder(aCoder: NSCoder!) {
        aCoder.encodeInteger(score, forKey: "score")
    }

    init(coder aDecoder: NSCoder!) {
        score = aDecoder.decodeIntegerForKey("score")
    }

    override init() {
    }
}

class ArchivePlayer:NSObject {

    var documentDirectories:NSArray = []
    var documentDirectory:String = ""
    var path:String = ""

    func savePlayer(#player: Player) {
        documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        documentDirectory = documentDirectories.objectAtIndex(0) as String
        path = documentDirectory.stringByAppendingPathComponent("players.archive")

        if NSKeyedArchiver.archiveRootObject(player, toFile: path) {
            println("Success writing to file!")
        } else {
            println("Unable to write to file!")
        }
    }

    func retrievePlayer() -> NSObject {
        var dataToRetrieve = Player()
        documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        documentDirectory = documentDirectories.objectAtIndex(0) as String
        path = documentDirectory.stringByAppendingPathComponent("players.archive")
        if let dataToRetrieve2 = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? Player {
            dataToRetrieve = dataToRetrieve2 as Player
        }
        return(dataToRetrieve)
    }
}

然后在ViewController中:

import UIKit

class ViewController: UIViewController {

    var player = Player()

    override func viewDidLoad() {
        super.viewDidLoad()

        player.score = 22
        ArchivePlayer().savePlayer(player: player)
        let playerToRetrieve = ArchivePlayer().retrievePlayer() as Player
        println(playerToRetrieve.score)
    }
}

这演示了归档和取消归档文件。打印“成功写入文件!”演示存档。打印存储的对象player.score以演示取消归档。

答案 2 :(得分:0)

对于存储Player对象的数组,这里是NSObject类:

import Foundation

class Player: NSObject {

    var score:Int = 0

    func encodeWithCoder(aCoder: NSCoder!) {
        aCoder.encodeInteger(score, forKey: "score")
    }

    init(coder aDecoder: NSCoder!) {
        score = aDecoder.decodeIntegerForKey("score")
    }

    override init() {
    }
}

class ArchivePlayer:NSObject {

    var documentDirectories:NSArray = []
    var documentDirectory:String = ""
    var path:String = ""

    func savePlayerArray(#playerArray: [Player]) {
        documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        documentDirectory = documentDirectories.objectAtIndex(0) as String
        path = documentDirectory.stringByAppendingPathComponent("playersArray.archive")

        if NSKeyedArchiver.archiveRootObject(playerArray, toFile: path) {
            println("Success writing to file!")
        } else {
            println("Unable to write to file!")
        }
    }

    func retrievePlayerArray() -> NSObject {
        var dataToRetrieve = [Player]()
        documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        documentDirectory = documentDirectories.objectAtIndex(0) as String
        path = documentDirectory.stringByAppendingPathComponent("playersArray.archive")
        if let dataToRetrieve2 = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? [Player] {
            dataToRetrieve = dataToRetrieve2
        }
        return(dataToRetrieve)
    }
}

这是ViewController:

import UIKit

class ViewController: UIViewController {

    var player1 = Player()
    var player2 = Player()
    var player3 = Player()
    var playerArchiveArray = [Player]()

    override func viewDidLoad() {
        super.viewDidLoad()


        player1.score = 12
        player2.score = 22
        player3.score = 32
        playerArchiveArray = [player1, player2, player3]
        ArchivePlayer().savePlayerArray(playerArray: playerArchiveArray)
        var playerRetrieveArray = ArchivePlayer().retrievePlayerArray() as [Player]

        for player in playerRetrieveArray {
            println(player.score)
        }
    }
}