2017-01-01 7 views
0

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

class Settings: NSObject { 
    var name: String? = "" 
    var addresss: [Address] = [Address]() 
    var addressSelectedIndex: Int = 0 
    .... 
} 

class Address: NSObject { 
    var street: String? = "" 
    var city: String? = "" 
    .... 
} 

я добавил кодера и декодера к обоим классам. Получение ошибки при:

func encodeWithCoder(aCoder: NSCoder) { 
    .... 
    if let _addresss = self.addresss { // here 
     aCoder.encodeObject(_ addresss, forKey: "addresss") 
    } 
} 

Initializer для условной привязки должны иметь факультативный тип, а не '[Адрес]'

+3

Вам не нужно использовать, если позволить адрес = self.address, непосредственно использовать 'aCode.encodeObject (адрес, forKey: "адрес")' является хорошо. ** если let ** работает только для проверки необязательного типа, но ваше определение адреса не является необязательным типом. – bubuxu

+0

Ваш вопрос не имеет ничего общего с сохранением пользовательских объектов в 'NSUserDefaults'. Речь идет о ошибке Swift. Пожалуйста, [поиск по ошибке] (http://stackoverflow.com/search?q=%5Bswift%5D+Initializer+for+conditional+binding+must+have+Optional+type%2C+not), прежде чем отправлять свой вопрос. – rmaddy

+0

спасибо bubuxu, это сработало – alrarea

ответ

0

addresss не является необязательное свойство, инициализируем это будет пустой массив. Поэтому не имеет смысла делать nil проверка этого объекта недвижимости с помощью if let.

Ваша функция кодирования должна выглядеть следующим:

func encodeWithCoder(aCoder: NSCoder) { 
    .... 
    aCoder.encodeObject(addresss, forKey: "addresss") 
} 
0

Поскольку вы объявленную

var addresss: [Address] = [Address]() 

addresss не обязательно, поэтому вам не нужно использовать if let.

Вы должны объявить его как:

var addresss: [Address]? 

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

  • Нет связанных вопросов^_^