簡體   English   中英

無法在Swift中解碼NSObject

[英]Unable to decode a NSObject in Swift

在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

每當我嘗試取消存檔時,它都會崩潰。 有人有任何原因嗎?

PS我不知道為什么我的代碼沒有格式化。 我縮進了4個空格! 對於那個很抱歉!

這是我為使其正常工作所做的事情:

  1. 在我的應用程序代理中創建了播放器實例
  2. 如果您的應用程序UIApplication.sharedApplication()。player,則可以在任何地方調用此函數

這應該工作。 如果您希望保存一個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以演示取消存檔。

為了存儲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)
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM