2014-12-11 2 views
1

Я пытаюсь написать содержимое массива до NSUserDefaults, но приложение зависает, когда я вызываю setObject:withKey с массивом в качестве объекта. Вот соответствующий код:Как написать массив в NSUserDefaults в Swift

class Contact: NSObject { 
    var name:String = "" 
    var number:String = "" 
} 

var contacts:[Contact]? 

contacts = [Contact]() 

let contact = Contact() 
contact.name = "Joe" 
contact.number = "123-4567" 
contacts.append(contact) 

let defaults = NSUserDefaults.standardUserDefaults() 
// Never returns from this when I step over it in the debugger 
defaults.setObject(contacts, forKey: "contacts") 
defaults.synchronize() 

Что я делаю неправильно?

+1

Вызов 'defaults.synchronize()' в этом случае не нужен (как и в большинстве случаев). Пожалуйста, дайте демону cfprefsd решить, когда делать само сохранение. –

+0

@jshier Полезно знать. Благодарю. – Epsilon

ответ

2

Не знаете, как это работает на OS X, но если это что-то вроде iOS, вы не можете хранить пользовательские классы в NSUserDefaults, только Strings, Ints, Data и т. Д., Поэтому одна работа вокруг для преобразования вашего массива в NSData, а затем сохранить его как данные, и когда вы его получите, нажмите [Contact]. Это может выглядеть примерно так:

let data = NSKeyedArchiver.archivedDataWithRootObject(contacts) 
    let defaults = NSUserDefaults.standardUserDefaults() 
    // Storing the data 
    defaults.setObject(data, forKey: "contacts") 

    // Retrieving the data 
    if let data = defaults.objectForKey("contacts") as? NSData { 
     if let contacts = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [Contact] { 
      // Now you have your contacts 
     } 
    } 

Однако, если вы хранения больших объемов данных, вы, вероятно, следует рассмотреть другие формы управления данными.

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