Ich habe ein paar verwandte Themen zu dieser Frage gefunden, aber ich verstehe nicht, wie die dort vorgestellten Lösungen auf eine Singleton-Klasse anwendbar sind.Unbekannter Selektor gesendet an Klasse (Singleton)
Wenn mein app startet, rufe ich gamestate.shardInstance()
in applicationDidBecomeActive
aber es stürzt ab sofort mit dem gleichen Fehler jedes Mal:
2017-03-22 11:09:09.102 project-mars[46108:28079112] +[project_mars.gameState encodeWithCoder:]: unrecognized selector sent to class 0x103670e60 2017-03-22 11:09:09.107 project-mars[46108:28079112] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[project_mars.gameState encodeWithCoder:]: unrecognized selector sent to class 0x103670e60'
Kann jemand bitte helfen Sie mir zu verstehen, was genau in diesen Fehlern passiert und wie etwas reparieren? Vielen Dank!
class gameState: NSObject, NSCoding {
var GameSettings:gameSettings //Structure that stores all the game settings
var PlayerStats:gameStatistics //Structure that stores all game stats
var GameBoard:gameBoard //Contains the information of the gameboard
private static var Instance: gameState = {
let instance = gameState.loadgameState()
//Closure for configuration
return instance!
}()
private override init(){
self.GameSettings = gameSettings()
self.PlayerStats = gameStatistics()
self.GameBoard = gameBoard()
super.init()
}
class func sharedInstance() -> gameState{
return gameState.Instance
}
required init?(coder aDecoder: NSCoder) {
self.GameSettings = (aDecoder.decodeObject(forKey: "GameSettings") as? gameSettings)!
self.PlayerStats = (aDecoder.decodeObject(forKey: "PlayerStats") as? gameStatistics)!
self.GameBoard = (aDecoder.decodeObject(forKey: "GameBoard") as? gameBoard)!
}
func encode(with aCoder: NSCoder) {
aCoder.encode(gameState.sharedInstance().GameSettings, forKey: "GameSettings")
aCoder.encode(gameState.sharedInstance().PlayerStats, forKey: "PlayerStats")
aCoder.encode(gameState.sharedInstance().GameBoard, forKey: "GameBoard")
}
class func loadgameState() ->gameState? {
let path = gameState.getFilePath()
print("PATH: \(path) \n")
if gameState.fileExistsAtPath(path: path){
if let rawData = NSData(contentsOfFile: path) {
/// do we get serialized data back from the attempted path?
/// if so, unarchive it into an AnyObject, and then convert to a GameData object
if(rawData.length != 0){
if let data = NSKeyedUnarchiver.unarchiveObject(with: rawData as Data) as? gameState {
return data
}
}
}
return gameState()
}else{
return gameState()
}
}
Nichts für ungut, aber Ihr Code ist schrecklich zu lesen. Die Namenskonvention (Groß- und Kleinschreibung) ist umgekehrt. – vadian
Vielen Dank für Ihren Kommentar, ich würde sagen, das ist eine stilistische Vorliebe, aber jeder für sich. Wenn Sie es nicht lesen können, glaube ich nicht, dass es sehr unklar ist. – Aleksandr
Wenn Ihre stilistische Präferenz das genaue Gegenteil der Frameworks ist, mit denen Sie interagieren, und auch den Textmarker der SO-Syntax dazu bringt, alle Farben falsch zu machen, macht das Ihren Code schwer lesbar. – dan