Сохранить пользовательский объект в NSUserDefaults в Swift

У меня есть класс сказать,

class GroupClass{
    var groupId: String = ""
    var groupName: String = ""
}

Я хочу иметь возможность хранить свой объект в NSUserDefaults. Я пробовал так,

let group = GroupClass()
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(group, forKey: "group")
defaults.synchronize()

и получил его следующим образом,

let defaults = NSUserDefaults.standardUserDefaults()        
var group = defaults.objectForKey("group") as! GroupClass

Он выдал исключение Using non-property obect и разбился. Как правильно это сделать в Swift?

Также пробовал следующим образом,

class GroupClass{
    var groupId: String = ""
    var groupName: String = ""

    required init(coder aDecoder: NSCoder) {
        self.groupId = aDecoder.decodeObjectForKey("groupId") as! String
        self.groupName = aDecoder.decodeObjectForKey("groupName") as! String

    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.groupId, forKey: "groupId")
        aCoder.encodeObject(self.groupName, forKey: "groupName")

    } 
}

Но let group = GroupClass(coder:NSCoder()) вызывает проблемы.


person Dark Drake    schedule 23.04.2016    source источник
comment
используйте NSKeyedArchiver для этого   -  person EI Captain v2.0    schedule 23.04.2016
comment
@EICaptain Не могли бы вы предоставить демо-код, я новичок в Swift.   -  person Dark Drake    schedule 23.04.2016
comment
2-й ответ находится в быстрой stackoverflow.com/questions/19720611/   -  person EI Captain v2.0    schedule 23.04.2016
comment
@EICaptain Я пробовал так let group = GroupClass(coder:NSCoder()) это вызывает проблему   -  person Dark Drake    schedule 23.04.2016
comment
полное решение в этом ответе... проверьте внимательно... может быть какая-то ошибка   -  person EI Captain v2.0    schedule 23.04.2016
comment
@EICaptain - это правильный способ создания объекта? let group = GroupClass(coder:NSCoder()) как говорится cannot be sent to an abstract object of class NSCoder: Create a concrete instance!'   -  person Dark Drake    schedule 23.04.2016
comment
@DarkDrake, ты можешь решить этот вопрос? Можете ли вы загрузить решение, если вы решите это.   -  person ASN    schedule 01.12.2016


Ответы (1)


Вы не можете сохранить ссылку на класс в userdefault. group - это ваша ссылка на ваш класс. почему вы его сохраняете. он просто указывает ваш класс в памяти. он будет уничтожен после завершения своей задачи. userdefaults предназначены для хранения данных, таких как строки, массивы, словари и т. д. вам не нужно хранить ссылку в базе данных. я так не думаю.

вы можете установить group.groupId или group.groupName в пользовательских настройках по умолчанию. затем также, если вы хотите сохранить это, вы можете преобразовать его в nsdata с помощью NSKeyedArchiver и сохранить эти данные в nsuserdefault и unarchive, когда это необходимо, с помощью NSKeyedUnArchiver.

Надеюсь, это поможет :)

person Ketan Parmar    schedule 23.04.2016