5

大家好,任何人都知道如何在 swift 4 中保存数据我制作了一个表情符号应用程序,我可以描述表情符号,我有一个未来可以在应用程序中保存新的表情符号我在我的表情符号类中编写了这段代码,但是当我想要返回表情符号我收到错误请帮助我。

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
    }

}
4

1 回答 1

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]()
   }
}
于 2017-10-03T17:14:03.993 回答