Ios JSONDecoder().decode从何处获取数据?

Ios JSONDecoder().decode从何处获取数据?,ios,swift,jsondecoder,Ios,Swift,Jsondecoder,如果这听起来很愚蠢,我很抱歉,但是JSONDecoder的数据是从哪里来的呢?我不断得到网格和红色,所以我认为这只是解码我设置的这个虚拟对象,而不是上次程序运行时的JSONEncoder.encodemyStarageObject。以下是我通过在线教程和示例管理的代码: private func loadMyObject() -> MyObject? { let jsonString = """ { "type":"Grid", "color":"Red",

如果这听起来很愚蠢,我很抱歉,但是JSONDecoder的数据是从哪里来的呢?我不断得到网格和红色,所以我认为这只是解码我设置的这个虚拟对象,而不是上次程序运行时的JSONEncoder.encodemyStarageObject。以下是我通过在线教程和示例管理的代码:

private func loadMyObject() -> MyObject? {
  let jsonString = """
  {
   "type":"Grid",
    "color":"Red",
    "lineThickness":2
  }
  """
  if let jsonData = jsonString.data(using: .utf8) {
    do {
      let loadedObject = try JSONDecoder().decode(myStorageStruct.self,from: jsonData)
      print("I loaded type \(loadedObject.type) of color: \(loadedObject.color)")
      return makeMyObjectFromStorageData(loadedObject)
      } else {
        return nil
      }
    } catch  let error { print(error) }
  } else {
    return nil
  }
return nil
}

如果您希望写入文件并在以后从中读取,则需要手动执行这些操作

写:

let json: Data
do {
    // encoder is a JSONEncoder
    json = try encoder.encode(someObject)
} catch {
    // Failure to encode. Do something sensible with `error`.
}

do {
    try json.write(to: archiveURL)
} catch {
    // Failure to write to disk. Do something sensible with `error`.
}
全文如下:

let json: Data
do {
    json = try Data(contentsOf: archiveURL)
} catch {
    // Failure to read from disk. Do something sensible with `error`.
}

// Replace MyType with the actual type.
let someObject: MyType
do {
    // decoder is a JSONDecoder
    someObject = try decoder.decode(MyType.self, from: json)
} catch {
    // Failure to decode. Do something sensible with `error`.
}

您可以根据计划如何处理错误来缩短这些示例,但这是要点。

对于我在写作中发现的少量数据存储

let userDefaults = UserDefaults.standard
userDefaults.set(yourTypeVariable,"type")
和我一起读书

let userDefaults = UserDefaults.standard
let defaultType = userDefaults.string("type")

工作正常。

将伪数据作为from:jsonData传递给解码器…不相关,但是jsonString.datausing:.utf8将永远不会失败。如果你有强迫恐惧症,你可以写让jsonData=DatajsonString.utf8Hi Martin R。我意识到我正在将虚拟数据传递给解码器,因为这就是我所看到的所有示例。我想问的是,我应该传递什么来获取上次执行程序时编码的对象?@PaulK。你在用编码的数据做什么?您是否以任何方式将其保存到文件、网络等中。?无论您执行什么操作来保存数据,您都需要执行相反的操作。我正在尝试将一些用户首选项数据从一个执行保存到下一个执行。当我尝试使用NSCoding时,说明是创建一个使用的ArchiveURL。这对我来说很有意义,因为数据似乎被写入文件并保存在文件系统中。但当我寻求帮助时,人们告诉我“你不应该使用NSCoding,使用Codable。”可编码示例使用JSON进行编码和解码,但我不知道文件系统在哪里使用,所以我不知道对象数据去了哪里……谢谢。不幸的是,这段编写代码失败的方式是第一个捕获无法捕获,因此我无法告诉您它失败的原因。谢谢你的帮助,很抱歉我不能提供更多的信息。我希望我知道怎么做。@PaulK。你能分享你做这件事的确切代码以及它是如何失败的吗?它会崩溃吗?它是否产生了意外的数据?如果您在捕捉块内打印错误,是否打印了任何内容?上面的代码不会因错误而失败,也不会捕获错误,因此准确地查看您得到了什么是很有帮助的。