2016-10-26 1 views
0

этой структуры является работа в быстром 2фатальная ошибка: неожиданно нашли ноль в то время как разворачивание необязательное значение в Swift 3

У меня есть Swift 3-структуру, как это.

let tempContacts = NSMutableArray() 
let arrayOfArray = NSMutableArray() 

У меня закодировать Person объект в этом для цикла

for person in tempContacts as! [Person] { 

     let encodedObject: Data = NSKeyedArchiver.archivedData(withRootObject: person) as Data 
     arrayOfArray.add(encodedObject) 

    } 

У меня декодировать данные в этом для цикла

let tempContacts2 = NSMutableArray() 
    for data in arrayOfArray { 

     let person: Person = NSKeyedUnarchiver.unarchiveObject(with: data as! Data) as! Person 
     tempContacts2.add(person) 

    } 

но unarchiveObject всегда возвращают ноль значение

+0

ли ваш объект 'Person' соответствует к протоколу NSCoding? – Callam

+0

Да, я использовал протокол NScoding в классе Person –

+3

Почему вы используете ** Swift! ** совершенно несвязанный тип типа 'NSMutableArray', а не Swift' Array' с фактическим типом '[Person]' в декоде часть? Вы выбрасываете информацию о типе, которая является важной семантикой Свифта. – vadian

ответ

0

Сначала ваш класс модели должен соответствовать протоколу NSCoder. Остальное очень просто, нет необходимости хранить заархивированные результаты для каждого объекта в массиве, вы можете передать исходный массив непосредственно NSKeyedArchiver так:

class Person: NSObject, NSCoding { 
    var name = "" 

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

    // NSCoder 
    required convenience init?(coder decoder: NSCoder) { 
     guard let name = decoder.decodeObject(forKey: "name") as? String else { return nil } 
     self.init(name: name) 
    } 

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

let tempContacts = [Person(name: "John"), Person(name: "Mary")] 

let encodedObjects = NSKeyedArchiver.archivedData(withRootObject: tempContacts) 
let decodedObjects = NSKeyedUnarchiver.unarchiveObject(with: encodedObjects) 

В качестве побочного примечания: если соблюдение NSCoder правильно реализована в вашем классе модели, вы, конечно, можете использовать свой способ архивирования/разборки отдельных объектов. Так что ваш исходный код работает также, с некоторыми незначительными изменениями:

for person in tempContacts { 
    let encodedObject = NSKeyedArchiver.archivedData(withRootObject: person) 
    arrayOfArray.add(encodedObject) 
} 

var tempContacts2 = [Person]() 
for data in arrayOfArray { 
    let person: Person = NSKeyedUnarchiver.unarchiveObject(with: data as! Data) as! Person 
    tempContacts2.append(person) 
} 

Примечания 2: если вы абсолютно хотите использовать NSMutableArray сек, что можно тоже просто определить tempContacts так:

let tempContacts = NSMutableArray(array: [Person(name: "John"), Person(name: "Mary")]) 

отдых работает без изменений.

Примечание 3: Причина, по которой используется для работы в Swift 2 и он больше не работает в Swift 3 является то, что сигнатура метода NSCoder func encode(with coder:) изменился в Swift 3.

+0

Извините, у меня есть tempContacts is not [Person] arrye used –

+0

, но на самом деле tempContacts это NSMutableArray() –

+0

let person: Person = Person (имя: «John») –

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

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