Я пытаюсь сохранить мой массив структуры. И я прочитал все сообщения, которые я смог найти для этой темы. Наконец, я использовал один пример и немного лишил его, но он не работает. Он не сохраняет, поэтому он не смог прочитать:Попытка сохранить массив struct: failed
func path() -> String {
return URL(fileURLWithPath: "/Volumes/MacOS/fasttemp/Test.TXT").absoluteString
}
struct Movie {
let name: String
let releaseYear: Int
}
protocol Dictionariable {
func dictionaryRepresentation() -> NSDictionary
init?(dictionaryRepresentation: NSDictionary?)
}
extension Movie: Dictionariable {
func dictionaryRepresentation() -> NSDictionary {
let representation: [String: AnyObject] = [
"name": name as AnyObject,
"releaseYear": releaseYear as AnyObject
]
return representation as NSDictionary
}
init?(dictionaryRepresentation: NSDictionary?) {
guard let values = dictionaryRepresentation else {return nil}
if let name = values["name"] as? String,
let releaseYear = values["releaseYear"] as? Int {
self.name = name
self.releaseYear = releaseYear
} else {
return nil
}
}
}
func extractStructureFromArchive<T: Dictionariable>() -> T? {
guard let encodedDict = NSKeyedUnarchiver.unarchiveObject(withFile: path()) as? NSDictionary else {return nil}
return T(dictionaryRepresentation: encodedDict)
}
func archiveStructure<T: Dictionariable>(structure: T) {
let encodedValue = structure.dictionaryRepresentation()
NSKeyedArchiver.archiveRootObject(encodedValue, toFile: path())
}
func extractStructuresFromArchive<T: Dictionariable>() -> [T] {
guard let encodedArray = NSKeyedUnarchiver.unarchiveObject(withFile: path()) as? [AnyObject] else {return []}
return encodedArray.map{$0 as? NSDictionary}.flatMap{T(dictionaryRepresentation: $0)}
}
func archiveStructureInstances<T: Dictionariable>(structures: [T]) {
let encodedValues = structures.map{$0.dictionaryRepresentation()}
NSKeyedArchiver.archiveRootObject(encodedValues, toFile: path())
}
let movies = [
Movie(name: "Avatar", releaseYear: 2009),
Movie(name: "The Dark Knight", releaseYear: 2008)
]
// this fails!
archiveStructureInstances(structures: movies)
let someArray: [Movie] = extractStructuresFromArchive()
print("\(someArray[0].name)")
Файл не создан. Папка существует. Что с этим не так? Я использую XCode 8.2.1 с Swift 3.
Добавлено: Я взял этот пример из другого вопроса/ответа. Я также уменьшил его с 3 до 2 членов структуры. И я обновил его для Swift 3. Но он все равно не работает! Вот почему я спрашиваю.
Возможный дубликат (HTTP. [Архивный массив дополнительных структур с NSCoding в Swift?]: // stackoverflow.com/questions/25311098/archive-array-of-optional-structs-with-nscoding-in-swift) – shallowThought
(см. выше): Я взял этот пример из этого вопроса/ответа. Я также уменьшил его с 3 до 2 Я обновил его для Swift 3. Но он все еще не работает! Вот почему я спрашиваю. –