2016-10-13 5 views
1

Так что у меня проблема. Я делаю это приложение, которое в настоящее время хранит информацию для «Курсов». Тем не менее, я менял приложение много, и теперь мне нужен словарь курсов. Мне нужно сохранить этот словарь курсов и загрузить его из любого класса.Как хранить словарь массивов пользовательских объектов с помощью NSCoding swift

В настоящее время в курсе.swift У меня есть настройка NSCoding. Моя программа записывает и читает всю информацию о курсе. Но теперь я хочу изменить его так, чтобы он записывал этот словарь вместо всех курсов. У меня нет другого класса данных, который содержит этот словарь, его просто удерживают в моем «StartUpViewController.swift».

class Course: NSObject, NSCoding { 

// MARK: Properties 
var courseName : String 
var projects : [String] 
var projectMarks : [Double] 
var projectOutOf : [Double] 
var projectWeights : [Double] 

// MARK: Archiving Paths 

static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first! 
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("courses") 
// MARK: Types 

struct PropertyKey { 
    static let courseNameKey = "courseName" 
    static let projectsKey = "projects" 
    static let projectMarksKey = "projectMarks" 
    static let projectOutOfKey = "projectOutOf" 
    static let projectWeightsKey = "projectWeights" 
} 

// MARK: NSCoding 

func encode(with aCoder: NSCoder) { 
    aCoder.encode(courseName, forKey: PropertyKey.courseNameKey) 
    aCoder.encode(projects, forKey: PropertyKey.projectsKey) 
    aCoder.encode(projectMarks, forKey: PropertyKey.projectMarksKey) 
    aCoder.encode(projectOutOf, forKey: PropertyKey.projectOutOfKey) 
    aCoder.encode(projectWeights, forKey: PropertyKey.projectWeightsKey) 
} 

required convenience init?(coder aDecoder: NSCoder) { 
    let courseName = aDecoder.decodeObject(forKey: PropertyKey.courseNameKey) as! String 
    let projects = aDecoder.decodeObject(forKey: PropertyKey.projectsKey) as! [String] 
    let projectMarks = aDecoder.decodeObject(forKey: PropertyKey.projectMarksKey) as! [Double] 
    let projectOutOf = aDecoder.decodeObject(forKey: PropertyKey.projectOutOfKey) as! [Double] 
    let projectWeights = aDecoder.decodeObject(forKey: PropertyKey.projectWeightsKey) as! [Double] 

    self.init(courseName: courseName, projects: projects, projectMarks: projectMarks, projectOutOf: projectOutOf, projectWeights: projectWeights) 
} 

Как мне это сделать? Поддерживаю ли я курс Course.swift с помощью NSCoding, или мне нужно только поместить NSCoding в свой контроллер просмотра?

class StartUpViewController: UIViewController { 

var groups: [String: [Course]?] = [:] 

... 
} 

ответ

2

Создайте новый класс, соответствующий NSCoding.

Этот новый класс имеет свойство:

var courses: [String : Course]? 

И методы:

func encode(with aCoder: NSCoder) { 
    if let courses = courses { 
     aCoder.encode(courses, forKey: "courses") 
    } 
} 

required convenience init?(coder aDecoder: NSCoder) { 
    courses = aDecoder.decodeObject(forKey: "courses") as? [String : Course] 
    } 

И оставить реализацию протокола NSCoding в классе курс, потому что он будет использоваться при кодировании словаря.

+0

Спасибо за ваш ответ, у меня есть еще один вопрос. Теперь, когда я иду, чтобы сохранить все, мне нужно только сохранить «группы» или мне нужно позвонить, чтобы сохранить все курсы? – Logan

+0

Вам просто нужно сохранить группу, которая автоматически сохранит курсы. –

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