2016-03-18 4 views
1
import UIKit 

struct PropertyKeys { 
    static let keyHightScore = "hightScore" 
    static let keyLastScore = "lastScore" 
    static let keyCurrentScore = "currentScore" 
} 

class GameSetting: NSObject, NSCoding { 

    var hightScore: Int 
    var currentScore: Int 
    var lastScore: Int 

    var life = 3 

    override init() { 
     hightScore = 0 
     currentScore = 0 
     lastScore = 0 

     super.init() 

     loadGameSetting() 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeInteger(hightScore, forKey: PropertyKeys.keyHightScore) 
     aCoder.encodeInteger(currentScore, forKey: PropertyKeys.keyCurrentScore) 
     aCoder.encodeInteger(lastScore, forKey: PropertyKeys.keyLastScore) 
    } 

    required convenience init?(coder aDecoder: NSCoder) { 
     var hightScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyHightScore) 
     var currentScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyCurrentScore) 
     var lastScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyLastScore) 

     self.init(hightScore: Int, currentScore: Int, lastScore: Int) { 
      self.hightScore = hightScore 
      self.currentScore = currentScore 
      self.lastScore = lastScore 
     } 
    } 

    func recordScore(score: Int) { 
     if score > hightScore { hightScore = score } 

     lastScore = score 

     saveGameSetting() 
    } 

    func saveGameSetting() { 
     NSUserDefaults.standardUserDefaults().setInteger(hightScore, forKey: PropertyKeys.keyHightScore) 
     NSUserDefaults.standardUserDefaults().setInteger(lastScore, forKey: PropertyKeys.keyLastScore) 
    } 

    func loadGameSetting() { 
     hightScore = NSUserDefaults.standardUserDefaults().integerForKey(PropertyKeys.keyHightScore) 
     lastScore = NSUserDefaults.standardUserDefaults().integerForKey(PropertyKeys.keyLastScore) 
    } 

    override var description: String { 
     return "HighScore: \(self.hightScore), lastScore: \(self.lastScore), currenScore: \(self.currentScore)" 
    } 

    func reset() { 
     currentScore = 0 
    } 

    func resetHightScore() { 
     hightScore = 0 
     lastScore = 0 

     saveGameSetting() 
    } 
} 

Что не так? Я не понимаю эту ошибку.Невозможно вызвать «GameSetting.init» с списком аргументов типа

Я ничего не могу найти по этому вопросу.

Я хочу, чтобы сохранить и закончил счет загрузки данных, и я после этого примера: https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson10.html

+0

Невозможно вызвать «GameSetting.init» с помощью списка аргументов типа (hightScore: Int.Type, currentScore: Int.Type, lastScore: Int.Type,() ->()) ' –

ответ

3

Вы не определили init метод с этими аргументами. Вы, наверное, хотите что-то вроде этого:

required convenience init?(coder aDecoder: NSCoder) { 
    let hightScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyHightScore) 
    let currentScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyCurrentScore) 
    let lastScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyLastScore) 

    self.init() 

    self.hightScore = hightScore 
    self.currentScore = currentScore 
    self.lastScore = lastScore 
} 

или создать удобство инициализации с заданными аргументами:

convenience init(highScore: Int, currentScore: Int, lastScore: Int) { 
    self.init() 
    self.hightScore = highScore 
    self.currentScore = currentScore 
    self.lastScore = lastScore 
} 
1

Похоже, у Вас есть неуместны «}», которые приводят к добавлению неуместны self

Где у вас есть:

required convenience init?(coder aDecoder: NSCoder) { 
    var hightScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyHightScore) 
    var currentScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyCurrentScore) 
    var lastScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyLastScore) 

    self.init(hightScore: Int, currentScore: Int, lastScore: Int) { 
     self.hightScore = hightScore 
     self.currentScore = currentScore 
     self.lastScore = lastScore 
    } 
} 

Я думаю, что вы хотите:

required convenience init?(coder aDecoder: NSCoder) { 
    var hightScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyHightScore) 
    var currentScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyCurrentScore) 
    var lastScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyLastScore) 

    self.init(hightScore:hightScore, currentScore:currentScore, lastScore:lastScore) 
} 

init(hightScore: Int, currentScore: Int, lastScore: Int) { 
    self.hightScore = hightScore 
    self.currentScore = currentScore 
    self.lastScore = lastScore 
} 

и это не выглядит как есть в любом случае для init на провал, так что нет никаких оснований для того, чтобы быть failable, а вары не изменяются, так что их let:

required convenience init(coder aDecoder: NSCoder) { 
    let hightScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyHightScore) 
    let currentScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyCurrentScore) 
    let lastScore = aDecoder.decodeIntegerForKey(PropertyKeys.keyLastScore) 

    self.init(hightScore:hightScore, currentScore:currentScore, lastScore:lastScore) 
}