Сбой NSCoder на decodeBool forKey (Xcode 8, Swift 3)

xcode boolean nskeyedarchiver nskeyedunarchiver

3604 просмотра

3 ответа

У меня есть этот простой класс

import UIKit

class SimpleModel: NSObject, NSCoding {

    var name : String!
    var done : Bool!

    init(name:String) {
        self.name = name
        self.done = false
    }

    internal required init?(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObject(forKey: "name") as! String
        self.done = aDecoder.decodeBool(forKey: "done") // BUG HERE
    }

    func encode(with encoder: NSCoder) {
        encoder.encode(self.name, forKey: "name")
        encoder.encode(self.done, forKey: "done")
    }
}

код сохранения:

let data = NSKeyedArchiver.archivedData(withRootObject: storageArray)
UserDefaults.standard.set(data, forKey: "storage")
UserDefaults.standard.synchronize()

прочитанный код:

if let data = UserDefaults.standard.data(forKey: "storage") {
    storageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as! [SimpleModel]
}

проблема возникает, когда NSKeyedUnarchiver выполняет свою работу. Я не могу понять, откуда проблема.

Спасибо!

Автор: Enlil Источник Размещён: 08.11.2019 11:17

Ответы (3)


13 плюса

Решение

Хитрость в том, чтобы удалить! образуют примитивные типы. Если вы положили! вы говорите «сделать неявное развертывание необязательным», поэтому кодировщик будет архивироваться как NSNumber вместо Bool (или Int, Double). Если вы удалите! кодировщик будет архивироваться как Bool, и все работает как положено (я провел «инцидент», и это решение предоставлено Apple)

Автор: Enlil Размещён: 21.09.2016 05:24

12 плюса

Boolи Intесть новые методы:

 self.x = Int(decoder.decodeCInt(forKey: "Speed"))
 self.y = decoder.decodeObject(forKey: "Serial") as! String
 self.z = Bool(decoder.decodeBool(forKey: "Direction") )
Автор: Sameer C Размещён: 26.09.2016 02:17

7 плюса

У меня такая же проблема. Попробуй это:

self.done = aDecoder.decodeObject(forKey: "done") as? Bool ?? aDecoder.decodeBool(forKey: "done")
Автор: mswyss Размещён: 17.09.2016 12:45
Вопросы из категории :
32x32