2016-10-06 10 views
0

Я пытаюсь сохранить и загрузить объект из постоянного хранилища в Xcode 8.0 с помощью Swift.Как декодировать Double с помощью NSCoder, NSObject и Swift 3 для iOS

Я следовал за уроком Start Developing iOS Apps (Swift): Jump Right In от Apple и имел ту же проблему с целым значением для рейтинга звезды.

Это «обрезанные» версия моего класса «Расхода», чтобы показать переменную «количество», которые у меня возникают проблемы с:

class Expense: NSObject, NSCoding { 
    var amount: Double 

    static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first! 
    static let ArchiveURL = DocumentsDirectory.appendingPathComponent("expenses") 

    struct PropertyKey { 
     static let amountKey = "amount" 
    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(amount, forKey:PropertyKey.amountKey) 
    } 

    required convenience init?(coder aDecoder: NSCoder) { 
     let amount = aDecoder.decodeObject(forKey: PropertyKey.amountKey) as! Double   

     self.init(date: date, amount: amount, description: description, image: image) 
    } 
} 

Когда я запустить симулятор и он пытается загрузить в «сумма» я получаю следующее исключение: «фатальная ошибка: неожиданно найденная nil при развертывании необязательного значения». Я очень новичок в Swift и xCode, и я действительно не знаю, как это исправить.

+2

let amount = aDecoder.decodeDouble (forKey: PropertyKey.amountKey) как Double? для обеспечения безопасности, не забудьте указать «количество» как необязательное (добавление в виде двойного?) Swift 3 –

+0

где «требуется удобство init? (Coder aDecoder: NSCoder) {' метод заканчивается? –

+0

@ Ахмад спасибо, что сработало. Можете ли вы отправить свой комментарий в качестве ответа, чтобы я мог «принять» его :) – Frederik

ответ

2
required convenience init?(coder aDecoder: NSCoder) { 
    // for safety, make sure to let "amount" as optional (adding as Double?) 
    let amount = aDecoder.decodeDouble(forKey:PropertyKey.amountKey) as Double? 

    self.init(date: date, amount: amount, description: description, image: image) 
} 
+1

Не нужно говорить 'как Double?' - просто пусть ' amount' не является необязательным и позволяет ему повышаться всякий раз, когда он должен быть передан в необязательный параметр. Выражение 'как Double? 'Не добавляет никакой безопасности. – Hamish

1

Попробуйте загрузить свойство в качестве опции:

let amount = aDecoder.decodeObject(forKey: PropertyKey.amountKey) as Double? 

Кроме того, для того, чтобы получить имущество из хранилища необходимо сохранить его в первую очередь. Если он еще не сохранен, вы должны обработать дело, это nil.