首页 > 解决方案 > 在 swift 中使用 UUID() 和 json

问题描述

我在网上找到了在 json 文件中使用硬编码 uuid 的示例,并且对我来说效果很好,但是当我在我的应用程序中添加从 json 数组中删除项目的功能时,我需要动态创建这些 uuid

这是我的 json 文件(list.json),它曾经有像 "id": 1 这样的硬编码 id 并且可以工作(当我使用 int 作为 ids 时)

[
  {
    "name": "Dune",
    "author": "Frank Herbert",
    "page": "77"
  },
  {
    "name": "Ready Player One",
    "author": "Ernest Cline",
    "page": "234"
  },
  {
    "name": "Murder on the Orient Express",
    "author": "Agatha Christie",
    "page": "133"
  }
]

这是我的结构(Book.swift)

struct Book: Hashable, Codable, Identifiable {
    var id = UUID()
    var name: String
    var author: String
    var page: String
}

当我使用这个结构和代码(Data.swift)解码我的json文件时......

let bookData: [Book] = load("list.json")

func load<T: Decodable>(_ filename: String) -> T {
    let data: Data
    
    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
        else {
            fatalError("Couldn't find \(filename) in main bundle.")
    }
    
    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }
    
    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}

我的最后一个致命错误被执行,因为 id 键没有与之关联的值(因为我在我的 json 文件中删除了它)

如何使用 id 初始化我的 json 文件,以便id = UUID()我的结构中的语句可以为其分配一个唯一的 id?

标签: jsonswiftcodabledecodable

解决方案


在这种情况下,您必须指定CodingKeys并省略id

struct Book: Hashable, Codable, Identifiable {
    let id = UUID()
    let name: String
    let author: String
    let page: String

    private enum CodingKeys : String, CodingKey { case name, author, page }
}

显然结构成员不会被修改,所以将它们声明为常量。


推荐阅读