如何使用可编码和文件管理器在swift 4中保存数据

时间:2017-10-03 17:01:29

标签: swift4 codable

大家都知道如何在swift 4中保存数据 我制作了一个表情符号应用程序,我可以描述表情符号,我有一个未来,我可以在应用程序中保存新表情符号我在表情符号类中编写此代码,但因为我想要返回表情符号,我得到一个错误,请帮助我。< / p>

import Foundation

struct Emoji : Codable {
    var symbol : String
    var name : String
    var description : String
    var usage : String
    static let documentsdirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    static let archiveurl = documentsdirectory.appendingPathComponent("emojis").appendingPathExtension("plist")

    static func SaveToFile (emojis: [Emoji]) {
        let propetyencod = PropertyListEncoder()
        let encodemoj = try? propetyencod.encode(emojis)
        try? encodemoj?.write(to : archiveurl , options : .noFileProtection)
    }
    static func loadeFromFile () -> [Emoji] {
    let propetydicod = PropertyListDecoder()
        if let retrivdate = try? Data(contentsOf: archiveurl),
        let decodemoj = try?
            propetydicod.decode(Array<Emoji>.self, from: retrivdate){

        }
        return decodemoj        in this line i get error
    }

}

1 个答案:

答案 0 :(得分:3)

发生错误是因为decodemoj超出了范围。你需要写

static func loadeFromFile() -> [Emoji] {
    let propetydicod = PropertyListDecoder()
    if let retrivdate = try? Data(contentsOf: archiveurl),
       let decodemoj = try? propetydicod.decode(Array<Emoji>.self, from: retrivdate) {
         return decodemoj
    }
    return [Emoji]()
}

并在发生错误时返回一个空数组。或者将返回值声明为可选数组并返回nil

但为什么不do - catch阻止?

static func loadeFromFile() -> [Emoji] {
   let propetydicod = PropertyListDecoder()
   do {
      let retrivdate = try Data(contentsOf: archiveurl)
      return try propetydicod.decode([Emoji].self, from: retrivdate)
   } catch {
     print(error)
     return [Emoji]()
   }
}