Więc idę przez ten samouczek, a ja w końcu zorientowali się, jak archiwizować obiektu przy użyciu NSCoding, a także zainicjować je z katalogu ponownie z failable inicjatora.Co to znaczy być zgodnym z NSCoding?
// To encode the object in the first place
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
}
// To 're-initialize' the object
required init?(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObject(forKey: "name") as! String
super.init()
}
Jednak nadal jestem trochę niepewny o tym, jak cały ten proces działa na wysokim poziomie. Proszę powiedz mi, gdzie moje myślenie jest nieprawidłowe.
1) Jeśli Twój obiekt przyjmuje protokół NSCoding, możesz użyć funkcji encode (z :), aby obiekt NSCoder przeszedł przez funkcję i wykonać metodę 'encode', przekazując właściwość instancji obiektu (która jest sam obiekt) jako pierwszy argument, a ciąg reprezentujący klucz jako druga wartość.
2) Jest to proces rekursywny, więc zasadniczo powodem, dla którego przekazujesz właściwość obiektu obiektu (tj. Nazwę), jest to, że TAKIE (która jest obiektem) może zostać wysłana wiadomość kodowania, i tak dalej oraz i tak dalej, aż przestanie docierać do urządzenia pobierającego NSCoding.
3) Obiekt aDecoder może również dekodować pewne rzeczy, więc po zainicjowaniu niestandardowego obiektu, będziesz chciał użyć uszkodzonego inicjalizatora do zdekodowania dowolnego obiektu dla niejednoznacznego klucza ciągu, którego użyłeś.
Oto co ja naprawdę nie rozumiem ...
jaki sposób obiekt aDecoder wiedzieć, które pojedynczy obiekt użyć do zestawu kluczy? Na przykład, powiedzmy, że mam 10 instancji obiektu psa. Kiedy system przechodzi aDekoderem, a ja używam metody decodeObject na nim, i ustawia self.name na wartość tego dekodowanego obiektu kluczem, w jaki sposób aDecoder wie, że nazwa tego psa została zapisana jako "Jack", a nie do uchwycić przypadkowo jedno z pozostałych nazw instancji psa, na przykład "Jodi"?
Innymi słowy, po zakodowaniu właściwości obiektu, w jaki sposób system plików wie, że właściwości instancji obiektu A są oddzielone od właściwości obiektu B, a więc w ten sposób, gdy aplikacja zostanie uruchomiona z powrotem, a obiekt A otrzyma zainicjowany, pobiera tylko właściwości obiektu A?
Dzięki
Do tego chciałbym dodać, że wykres obiektów jest przechowywany hierarchicznie w dół od pojedynczego obiektu głównego. Jeśli ten wykres obiektów zawiera pętle, zostanie zapisany tylko jeden raz, a kolejne punkty, do których odwołuje się ten obiekt, mają odwołania wstecz do pierwszej kopii obiektu. – dgatwood