2016-03-22 4 views
0

У меня модальное файл сущности, как показано ниже,Сохранение пользовательских NSObject в NSUserDefaults

import UIKit 
class MyProfile: NSObject { 
    var userName : String = "" 

    func initWithDict(dict: NSMutableDictionary) { 
    self.userName = dict.objectForKey("username") as! String 
    } 
} 

Saving, что объект путем кодирования, как показано ниже,

let myDict: NSMutableDictionary = ["username": "abc"] 
    let myEntity:MyProfile = MyProfile() 
    myEntity.initWithDict(myDict) 
    let userDefaults = NSUserDefaults.standardUserDefaults() 
    let encodedData = NSKeyedArchiver.archivedDataWithRootObject(myEntity) 
    userDefaults.setObject(encodedData, forKey: "MyProfileEntity") 
    userDefaults.synchronize() 

Получение, что сохраненный объект, как показано ниже,

let myEntity:MyProfile = MyProfile() 
    let userDefaults = NSUserDefaults.standardUserDefaults() 
    guard let decodedNSData = userDefaults.objectForKey("MyProfileEntity") as? NSData, 
     myEntity = NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData) as? MyProfile! 
     else { 
      print("Failed") 
      return 
    } 

    print(myEntity.userName) 

Это не работает, имеет сбои и много ошибок синтаксиса, я новичок в быстром,

Он показывает некоторые синтаксические ошибки, такие как Определение конфликтует с предыдущим значением в строке unarchiveObjectWithData. Если я исправлю эту ошибку, то во время получения объекта от userdefaults он сбой.

Может ли кто-нибудь предложить, как я могу его решить?

+0

Какие ошибки вы получаете? – ryantxr

+0

@ryantxr, он показывает некоторые синтаксические ошибки, такие как конфликты определения с предыдущим значением ..... – NAZIK

+0

Если вам нужна помощь, вам нужно быть конкретным. Обновите свой вопрос с помощью полных и точных сообщений об ошибках и укажите точные строки, вызывающие ошибки. – rmaddy

ответ

2

Чтобы сохранить пользовательский объект по умолчанию, вы должны реализовать протокол NSCoding. Пожалуйста, замените вашу модель пользовательских данных, как это:

class MyProfile: NSObject,NSCoding { 
var userName : String = "" 

@objc required init(coder aDecoder:NSCoder){ 

    self.userName = aDecoder.decodeObjectForKey("USER_NAME") as! String 

} 

@objc func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(self.userName, forKey: "USER_NAME") 
} 

init(dict: [String: String]) { 

    self.userName = dict["username"]! 
} 

override init() { 
    super.init() 
} 

}

Вот код для сохранения и извлечения MyProfile объекта:

// Save profile 
    func saveProfile(profile: MyProfile){ 
     let filename = NSHomeDirectory().stringByAppendingString("/Documents/profile.bin") 
     let data = NSKeyedArchiver.archivedDataWithRootObject(profile) 
     data.writeToFile(filename, atomically: true) 
    } 
    // Get profile 
    func getProfile() -> MyProfile?{ 

     if let data = NSData(contentsOfFile: NSHomeDirectory().stringByAppendingString("/Documents/profile.bin")){ 

      let unarchiveProfile = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! MyProfile 

       return unarchiveProfile 

     } else{ 

      return nil 

     } 

    } 

Теперь вот фрагмент кода, как использовать тот метод :

// Create profile object 
let profile = MyProfile(dict: ["username" : "MOHAMMAD"]) 
// save profile 
saveProfile(profile) 

// retrieve profile 
if let myProfile = getProfile(){ 
    print(myProfile.userName) 
}else{ 
    print("Profile not found") 
} 
+0

Спасибо за ответ, вы можете дать и сохранить и получить синтаксисы ...?Основные проблемы в этой части – NAZIK

+0

Привет @NAZIK проверить мой отредактированный ответ. Надеюсь, вам понравится :) – iMuzahid

+0

Еще раз спасибо, но есть ошибка в ur над кодом, «неправильная метка аргументов в вызове» при создании MyProfile - 'let profile = MyProfile (dict:' ...., Как это исправить? Я попробовал кодер вместо dict, но не повезло ... – NAZIK

1

Вы не можете это сделать:

let myEntity:MyProfile = MyProfile() 

Тогда позже, сделайте следующее:

myEntity = ... 

Когда что-то определяется с 'пусть', вы не можете изменить его.

Изменить на var myEntity: MyProfile?

Вполне возможно, что

NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData) 

возвращается ноль. Затем вы переходите к силе разворачивания путем добавления

as? MyProfile! 

попытаться изменить это

as? MyProfile 

потом, увидеть, если у вас есть что-то назад

if let myEntity = myEntity { 
    print(myEntity.userName) 
} 
+0

Спасибо за ответ, я нашел решение ... – NAZIK