Ios -[\u SwiftValue encodeWithCoder:]:发送到实例的选择器无法识别

Ios -[\u SwiftValue encodeWithCoder:]:发送到实例的选择器无法识别,ios,swift,nsuserdefaults,swift3,nscoder,Ios,Swift,Nsuserdefaults,Swift3,Nscoder,尝试使用NSCoder时出错 玩家。斯威夫特: class Player: NSObject, NSCoding { private var _playerName: String! private var _playerScore: Int! private var _playerColor: PlayerColor! //PlayerColor is an enum var playerName: String { get {

尝试使用NSCoder时出错

玩家。斯威夫特:

class Player: NSObject, NSCoding {

    private var _playerName: String!
    private var _playerScore: Int!
    private var _playerColor: PlayerColor! //PlayerColor is an enum

    var playerName: String {
        get {
            return _playerName
        }
        set {
            _playerName = newValue
        }
    }

    var playerScore: Int {
        get {
            return _playerScore
        }
        set {
            _playerScore = newValue
        }
    }

    var playerColor: PlayerColor {
        get {
            return _playerColor
        }
        set {
            _playerColor = newValue
        }
    }

    init(playerName: String, playerScore: Int, playerColor: PlayerColor) {

        _playerName = playerName
        _playerScore = playerScore
        _playerColor = playerColor
    }

    required convenience init(coder aDecoder: NSCoder) {
        let name = aDecoder.decodeObject(forKey: "name") as! String
        let score = aDecoder.decodeInteger(forKey: "score")
        let color = aDecoder.decodeObject(forKey: "color") as! PlayerColor
        self.init(playerName: name, playerScore: score, playerColor: color)
    }

    func encode(with aCoder: NSCoder){
        aCoder.encode(playerName, forKey: "name")
        aCoder.encode(playerScore, forKey: "score")
        aCoder.encode(playerColor, forKey: "color")
    }

}
// Storage Functions
func savePlayers(){
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: _playerArray) // _playerarray is a [Player] the very object I want to store/retrieve at will
    defaults.set(encodedData, forKey: playerKeyForDefaults) //defaults is just var NSUserDefaults.standard
    defaults.synchronize()
}

func loadPlayers(){
    if let decoded = defaults.object(forKey: playerKeyForDefaults) as? NSData {
        let array = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [Player]
        _playerArray = array
    }

}
import Foundation

    class Player: NSObject, NSCoding {

        private var name: String!
        private var score: Int!
        private var color: String!

        var playerName: String {
            get {
                return name
            }
            set {
                name = newValue
            }
        }

        var playerScore: Int {
            get {
                return score
            }
            set {
                score = newValue
            }
        }

        var playerColor: String {
            get {
                return color
            }
            set {
                color = newValue
            }
        }

        init(playerName: String, playerScore: Int, playerColor: String) {

            name = playerName
            score = playerScore
            color = playerColor
        }

        required convenience init(coder aDecoder: NSCoder) {
            let name = aDecoder.decodeObject(forKey: "name") as! String
            let score = aDecoder.decodeObject(forKey: "score") as! Int
            let color = aDecoder.decodeObject(forKey: "color") as! String
            self.init(playerName: name, playerScore: score, playerColor: color)
        }

        func encode(with aCoder: NSCoder){
            aCoder.encode(name, forKey: "name")
            aCoder.encode(score, forKey: "score")
            aCoder.encode(color, forKey: "color")
        }

    }
func savePlayers(){
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: _playerArray)
    defaults.set(encodedData, forKey: playerKeyForDefaults)
}

func loadPlayers(){
    if let decoded = defaults.object(forKey: playerKeyForDefaults) as? NSData {
        let array = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [Player]
        _playerArray = array
    }

}
在PlayerStore.swift:

class Player: NSObject, NSCoding {

    private var _playerName: String!
    private var _playerScore: Int!
    private var _playerColor: PlayerColor! //PlayerColor is an enum

    var playerName: String {
        get {
            return _playerName
        }
        set {
            _playerName = newValue
        }
    }

    var playerScore: Int {
        get {
            return _playerScore
        }
        set {
            _playerScore = newValue
        }
    }

    var playerColor: PlayerColor {
        get {
            return _playerColor
        }
        set {
            _playerColor = newValue
        }
    }

    init(playerName: String, playerScore: Int, playerColor: PlayerColor) {

        _playerName = playerName
        _playerScore = playerScore
        _playerColor = playerColor
    }

    required convenience init(coder aDecoder: NSCoder) {
        let name = aDecoder.decodeObject(forKey: "name") as! String
        let score = aDecoder.decodeInteger(forKey: "score")
        let color = aDecoder.decodeObject(forKey: "color") as! PlayerColor
        self.init(playerName: name, playerScore: score, playerColor: color)
    }

    func encode(with aCoder: NSCoder){
        aCoder.encode(playerName, forKey: "name")
        aCoder.encode(playerScore, forKey: "score")
        aCoder.encode(playerColor, forKey: "color")
    }

}
// Storage Functions
func savePlayers(){
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: _playerArray) // _playerarray is a [Player] the very object I want to store/retrieve at will
    defaults.set(encodedData, forKey: playerKeyForDefaults) //defaults is just var NSUserDefaults.standard
    defaults.synchronize()
}

func loadPlayers(){
    if let decoded = defaults.object(forKey: playerKeyForDefaults) as? NSData {
        let array = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [Player]
        _playerArray = array
    }

}
import Foundation

    class Player: NSObject, NSCoding {

        private var name: String!
        private var score: Int!
        private var color: String!

        var playerName: String {
            get {
                return name
            }
            set {
                name = newValue
            }
        }

        var playerScore: Int {
            get {
                return score
            }
            set {
                score = newValue
            }
        }

        var playerColor: String {
            get {
                return color
            }
            set {
                color = newValue
            }
        }

        init(playerName: String, playerScore: Int, playerColor: String) {

            name = playerName
            score = playerScore
            color = playerColor
        }

        required convenience init(coder aDecoder: NSCoder) {
            let name = aDecoder.decodeObject(forKey: "name") as! String
            let score = aDecoder.decodeObject(forKey: "score") as! Int
            let color = aDecoder.decodeObject(forKey: "color") as! String
            self.init(playerName: name, playerScore: score, playerColor: color)
        }

        func encode(with aCoder: NSCoder){
            aCoder.encode(name, forKey: "name")
            aCoder.encode(score, forKey: "score")
            aCoder.encode(color, forKey: "color")
        }

    }
func savePlayers(){
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: _playerArray)
    defaults.set(encodedData, forKey: playerKeyForDefaults)
}

func loadPlayers(){
    if let decoded = defaults.object(forKey: playerKeyForDefaults) as? NSData {
        let array = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [Player]
        _playerArray = array
    }

}

以下是我实施的解决方案:

玩家。斯威夫特:

class Player: NSObject, NSCoding {

    private var _playerName: String!
    private var _playerScore: Int!
    private var _playerColor: PlayerColor! //PlayerColor is an enum

    var playerName: String {
        get {
            return _playerName
        }
        set {
            _playerName = newValue
        }
    }

    var playerScore: Int {
        get {
            return _playerScore
        }
        set {
            _playerScore = newValue
        }
    }

    var playerColor: PlayerColor {
        get {
            return _playerColor
        }
        set {
            _playerColor = newValue
        }
    }

    init(playerName: String, playerScore: Int, playerColor: PlayerColor) {

        _playerName = playerName
        _playerScore = playerScore
        _playerColor = playerColor
    }

    required convenience init(coder aDecoder: NSCoder) {
        let name = aDecoder.decodeObject(forKey: "name") as! String
        let score = aDecoder.decodeInteger(forKey: "score")
        let color = aDecoder.decodeObject(forKey: "color") as! PlayerColor
        self.init(playerName: name, playerScore: score, playerColor: color)
    }

    func encode(with aCoder: NSCoder){
        aCoder.encode(playerName, forKey: "name")
        aCoder.encode(playerScore, forKey: "score")
        aCoder.encode(playerColor, forKey: "color")
    }

}
// Storage Functions
func savePlayers(){
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: _playerArray) // _playerarray is a [Player] the very object I want to store/retrieve at will
    defaults.set(encodedData, forKey: playerKeyForDefaults) //defaults is just var NSUserDefaults.standard
    defaults.synchronize()
}

func loadPlayers(){
    if let decoded = defaults.object(forKey: playerKeyForDefaults) as? NSData {
        let array = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [Player]
        _playerArray = array
    }

}
import Foundation

    class Player: NSObject, NSCoding {

        private var name: String!
        private var score: Int!
        private var color: String!

        var playerName: String {
            get {
                return name
            }
            set {
                name = newValue
            }
        }

        var playerScore: Int {
            get {
                return score
            }
            set {
                score = newValue
            }
        }

        var playerColor: String {
            get {
                return color
            }
            set {
                color = newValue
            }
        }

        init(playerName: String, playerScore: Int, playerColor: String) {

            name = playerName
            score = playerScore
            color = playerColor
        }

        required convenience init(coder aDecoder: NSCoder) {
            let name = aDecoder.decodeObject(forKey: "name") as! String
            let score = aDecoder.decodeObject(forKey: "score") as! Int
            let color = aDecoder.decodeObject(forKey: "color") as! String
            self.init(playerName: name, playerScore: score, playerColor: color)
        }

        func encode(with aCoder: NSCoder){
            aCoder.encode(name, forKey: "name")
            aCoder.encode(score, forKey: "score")
            aCoder.encode(color, forKey: "color")
        }

    }
func savePlayers(){
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: _playerArray)
    defaults.set(encodedData, forKey: playerKeyForDefaults)
}

func loadPlayers(){
    if let decoded = defaults.object(forKey: playerKeyForDefaults) as? NSData {
        let array = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [Player]
        _playerArray = array
    }

}
PlayerStore.swift:

class Player: NSObject, NSCoding {

    private var _playerName: String!
    private var _playerScore: Int!
    private var _playerColor: PlayerColor! //PlayerColor is an enum

    var playerName: String {
        get {
            return _playerName
        }
        set {
            _playerName = newValue
        }
    }

    var playerScore: Int {
        get {
            return _playerScore
        }
        set {
            _playerScore = newValue
        }
    }

    var playerColor: PlayerColor {
        get {
            return _playerColor
        }
        set {
            _playerColor = newValue
        }
    }

    init(playerName: String, playerScore: Int, playerColor: PlayerColor) {

        _playerName = playerName
        _playerScore = playerScore
        _playerColor = playerColor
    }

    required convenience init(coder aDecoder: NSCoder) {
        let name = aDecoder.decodeObject(forKey: "name") as! String
        let score = aDecoder.decodeInteger(forKey: "score")
        let color = aDecoder.decodeObject(forKey: "color") as! PlayerColor
        self.init(playerName: name, playerScore: score, playerColor: color)
    }

    func encode(with aCoder: NSCoder){
        aCoder.encode(playerName, forKey: "name")
        aCoder.encode(playerScore, forKey: "score")
        aCoder.encode(playerColor, forKey: "color")
    }

}
// Storage Functions
func savePlayers(){
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: _playerArray) // _playerarray is a [Player] the very object I want to store/retrieve at will
    defaults.set(encodedData, forKey: playerKeyForDefaults) //defaults is just var NSUserDefaults.standard
    defaults.synchronize()
}

func loadPlayers(){
    if let decoded = defaults.object(forKey: playerKeyForDefaults) as? NSData {
        let array = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [Player]
        _playerArray = array
    }

}
import Foundation

    class Player: NSObject, NSCoding {

        private var name: String!
        private var score: Int!
        private var color: String!

        var playerName: String {
            get {
                return name
            }
            set {
                name = newValue
            }
        }

        var playerScore: Int {
            get {
                return score
            }
            set {
                score = newValue
            }
        }

        var playerColor: String {
            get {
                return color
            }
            set {
                color = newValue
            }
        }

        init(playerName: String, playerScore: Int, playerColor: String) {

            name = playerName
            score = playerScore
            color = playerColor
        }

        required convenience init(coder aDecoder: NSCoder) {
            let name = aDecoder.decodeObject(forKey: "name") as! String
            let score = aDecoder.decodeObject(forKey: "score") as! Int
            let color = aDecoder.decodeObject(forKey: "color") as! String
            self.init(playerName: name, playerScore: score, playerColor: color)
        }

        func encode(with aCoder: NSCoder){
            aCoder.encode(name, forKey: "name")
            aCoder.encode(score, forKey: "score")
            aCoder.encode(color, forKey: "color")
        }

    }
func savePlayers(){
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: _playerArray)
    defaults.set(encodedData, forKey: playerKeyForDefaults)
}

func loadPlayers(){
    if let decoded = defaults.object(forKey: playerKeyForDefaults) as? NSData {
        let array = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [Player]
        _playerArray = array
    }

}

您还可以使用Enum rawValue使用这种方法。它可能会帮助您将ArchiveData和unarchiveObject作为一个完整的模型对象

具有十六进制值的颜色枚举:

enum PlayerColor: String {
    case red = "#FF0000"
    case silver = "#C0C0C0"
    case gray = "#808080"
    case black = "#000000"

    var description: String {
        return self.rawValue
    }
}

 import Foundation

class Player: NSObject, NSCoding {

    private var name: String!
    private var score: Int!
    private var color: PlayerColor!

    init(playerName: String, playerScore: Int, playerColor: PlayerColor) {

        name = playerName
        score = playerScore
        color = playerColor
    }

    required convenience init(coder aDecoder: NSCoder) {
        let name = aDecoder.decodeObject(forKey: "name") as! String
        let score = aDecoder.decodeObject(forKey: "score") as! Int

        if let value = aDecoder.decodeObject(forKey: "color") as? String{
            color = PlayerColor(rawValue: value)
        }
        self.init(playerName: name, playerScore: score, playerColor: color)
    }

    func encode(with aCoder: NSCoder){

        aCoder.encode(name, forKey: "name")
        aCoder.encode(score, forKey: "score")

        let value = color!.description
        aCoder.encode(value, forKey: "color")
    }

}

不能直接编码枚举、比较-重复?顺便说一句,Swift中不需要getter、setter和下划线变量(与其他一些语言一样)。除非你有特殊需要,它只是
var playerName:String
等等。我有两个浏览器,上面有一个链接到这篇文章。我想弄清楚有什么不同?另外,您为什么要更改帮助?@ScottyBlades OP删除了自定义的
PlayerColor
-enum,并使用
字符串对其进行了更改。如上所述,无法对枚举进行编码。