2017-03-22 2 views
0

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() 
    } 
} 
+0

Nichts für ungut, aber Ihr Code ist schrecklich zu lesen. Die Namenskonvention (Groß- und Kleinschreibung) ist umgekehrt. – vadian

+0

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

+1

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

Antwort

-1
class gameState { 

private var Score = "" 

static let sharedInstance : gameState = { 
     let instance = gameState() 
     return instance 
    }() 


func setScore(aScore : int) 
    { 
     Score = aScore 
    } 

func getScore() --> int 
    { 
     return Score 
    } 


} 



//once need to call func setScore 


    gameState.sharedInstance.setScore(aScore: 10) 
    gameState.sharedInstance.getScore() 
0

Ich denke, man sollte die lokale Instanz, ohne zu rufen, um die Singleton hier verwenden können. Sie sind bereits in der Singleton-Instanz

func encode(with aCoder: NSCoder) { 
    aCoder.encode(gameState.GameSettings, forKey: "GameSettings") 
    aCoder.encode(gameState.PlayerStats, forKey: "PlayerStats") 
    aCoder.encode(gameState.GameBoard, forKey: "GameBoard") 
} 

Bitte teilen sich die gameState.loadgameState() statische Methode - meine Vermutung ist etwas anderes dort geschieht.

Verwandte Themen