2016-09-22 3 views
0

У меня возникло затруднение в кодировании и декодировании свойства типа даты пользовательского класса Swift с помощью NSKeyedArchiver. Я называю KeyedArchiver с:Swift 3 Тип даты не кодируется как часть пользовательского класса

let savedData = NSKeyedArchiver.archivedData(withRootObject: timers) 
    let defaults = UserDefaults.standard 
    defaults.set(savedData, forKey: "timers") 

Это верхняя половина моего класса декларации:

class TimerModel: NSObject, NSCoding, AVAudioPlayerDelegate { 

var name: String 
var active: Bool 
var paused: Bool 
var duration: Int 
var remainingWhenPaused: Int? 
var timerEndTime: Date? 
var timerStartTime: Date? 
var audioAlert: AlertNoise 
var UUID: String 
var colorScheme: BaseColor 
var alarmRepetitions: Int 
var timerRepetitions: Int 
var currentTimerRepetition: Int 
var audioPlaying: Bool 
var player: AVAudioPlayer = AVAudioPlayer() 
var countDownTimer: Timer = Timer() 
var delegate: timerProtocol? = nil 

init(withName name: String, duration: Int, UUID: String, color: BaseColor, alertNoise: AlertNoise, timerRepetitions: Int, alarmRepetitions: Int, timerEndTime: Date? = nil) { 
    self.name = name 
    self.active = false 
    self.paused = false 
    self.duration = duration 
    self.UUID = UUID 
    self.audioAlert = alertNoise 
    self.colorScheme = color 
    self.alarmRepetitions = alarmRepetitions 
    self.audioPlaying = false 
    self.timerRepetitions = timerRepetitions 
    self.currentTimerRepetition = 0 

    super.init() 
} 

convenience override init() { 
    self.init(withName: "Tap Timer 1", duration: 10, UUID: Foundation.UUID().uuidString, color: .Red, alertNoise: .ChurchBell, timerRepetitions: 1, alarmRepetitions: 0) 
} 

// MARK: NSCoding 

required convenience init? (coder decoder: NSCoder) { 

    guard let name = decoder.decodeObject(forKey: "name") as? String 
    else { 
     print("init coder name guard failed") 
     return nil 
    } 

    let duration = decoder.decodeInteger(forKey: "duration") 

    guard let audioAlertRawValue = decoder.decodeObject(forKey: "audioAlert") as? String 
    else { 
     print("init coder audioAlert guard failed") 
     return nil 
    } 
    guard let UUID = decoder.decodeObject(forKey: "UUID") as? String 
    else { 
     print("init coder UUID guard failed") 
     return nil 
    } 
    guard let colorSchemeRawValue = decoder.decodeObject(forKey: "colorScheme") as? String 
    else { 
     print("init coder colorScheme guard failed") 
     return nil 
    } 

    let alarmRepetitions = decoder.decodeInteger(forKey: "alarmRepetitions") 

    let timerRepetitions = decoder.decodeInteger(forKey: "timerRepetitions") 

    guard let audioAlert = AlertNoise(rawValue: audioAlertRawValue) 
     else{ 
      print("No AlertNoise rawValue case found") 
      return nil 
    } 
    guard let colorScheme = BaseColor(rawValue: colorSchemeRawValue) 
     else{ 
      print("No BaseColor rawValue case found") 
      return nil 
    } 

    var timerEndTimeUnwrapped: Date? 

    if let timerEndTime = decoder.decodeObject(forKey: "timerEndTime") as? Date { 
     timerEndTimeUnwrapped = timerEndTime 
    } else { 
     timerEndTimeUnwrapped = nil 
    } 
    print("initCoder guards passed, initing timer") 
    print("\(name), \(duration), \(UUID), \(colorScheme), \(audioAlert), \(timerRepetitions), \(alarmRepetitions), \(timerEndTimeUnwrapped)") 

    self.init(withName: name, duration: duration, UUID: UUID, color: colorScheme, alertNoise: audioAlert, timerRepetitions: timerRepetitions, alarmRepetitions: alarmRepetitions, timerEndTime: timerEndTimeUnwrapped) 
} 

func encode(with aCoder: NSCoder) { 

    aCoder.encode(self.name, forKey: "name") 
    aCoder.encode(self.duration, forKey: "duration") 
    aCoder.encode(self.audioAlert.rawValue, forKey: "audioAlert") 
    aCoder.encode(self.UUID, forKey: "UUID") 
    aCoder.encode(self.colorScheme.rawValue, forKey: "colorScheme") 
    aCoder.encode(self.alarmRepetitions, forKey: "alarmRepetitions") 
    aCoder.encode(self.timerRepetitions, forKey: "timerRepetitions") 
    aCoder.encode(self.timerEndTime, forKey: "timerEndTime") 
} 

При попытке разархивировать объект из NSUserDefaults timerEndTimeUnwrapped всегда возвращается как nil. Либо я испортил разворачивание вещи, либо кодирование или декодирование провалились. Все остальное возвращается, как ожидалось, это просто тип даты, который является проблематичным

Любая помощь будет замечательной.

+0

Попробуйте преобразовать 'Date' в' NSDate', 'aCoder.encode (self.timerEndTime как NSDate, forKey:" timerEndTime ")' –

+0

Спасибо Нирау D, я нашел проблему - буквально боролся с этим за более чем день, я пропустил установку timerEndTime в функции init класса – SimonBarker

ответ

1

Так что это действительно глупая ошибка, проблема с добавлением свойств, когда класс используется много. Я не задавал timerEndTime в функции init класса!

Смежные вопросы