Сначала ваш класс модели должен соответствовать протоколу 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.
ли ваш объект 'Person' соответствует к протоколу NSCoding? – Callam
Да, я использовал протокол NScoding в классе Person –
Почему вы используете ** Swift! ** совершенно несвязанный тип типа 'NSMutableArray', а не Swift' Array' с фактическим типом '[Person]' в декоде часть? Вы выбрасываете информацию о типе, которая является важной семантикой Свифта. – vadian