2017-01-25 16 views
1

Я пытаюсь сохранить мой массив структуры. И я прочитал все сообщения, которые я смог найти для этой темы. Наконец, я использовал один пример и немного лишил его, но он не работает. Он не сохраняет, поэтому он не смог прочитать:Попытка сохранить массив 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. Но он все равно не работает! Вот почему я спрашиваю.

+0

Возможный дубликат (HTTP. [Архивный массив дополнительных структур с NSCoding в Swift?]: // stackoverflow.com/questions/25311098/archive-array-of-optional-structs-with-nscoding-in-swift) – shallowThought

+0

(см. выше): Я взял этот пример из этого вопроса/ответа. Я также уменьшил его с 3 до 2 Я обновил его для Swift 3. Но он все еще не работает! Вот почему я спрашиваю. –

ответ

1

Ваш path неправ. Вы не архивируете файл. Вы должны использовать каталог.

Изменение path() METHODE к этому (from this answer):

func path() -> String { 
    let documentsPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first 
    let path = documentsPath! + "/Movie" 
    return path 
} 

Ваш код отпечатков Avatar как ожидалось

+0

Ты прав. О, мне так стыдно! Извините за этот глупый вопрос. –

+0

Это должно быть: URL (файлURLWithPath: "/Volumes/MacOS/fasttemp/Test.TXT").path вместо absoluteString. –