如何将 json 解码为 Codable 以便在 SwiftUI 预览中使用?

How to decode json into a Codable to use in a SwiftUI Preview?

想知道是否有办法将某些 json 解码为 Codable,它是 View 的依赖项,以便我可以使用 swiftUI 预览?

这是 Codable 的工作单元测试

    func testDecode() {
        let data = Data(jsonProj.utf8)
        //frmt
        let frmt2 = DateFormatter()
        frmt2.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSX"
        //decoder
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
            let container = try decoder.singleValueContainer()
            let dateStr = try container.decode(String.self)
            guard let d = frmt2.date(from: dateStr) else { fatalError() } //fixme some danger here
            return d
        })
        do {
            let p = try decoder.decode(Project.self, from: data)
            XCTAssertEqual(p.id, 2)
            print(p)
        }
        catch {
            print(error)
            XCTFail()
        }
    }

我想在这里使用它

struct PreProjectCell_Previews: PreviewProvider {

   //static let decodedJson: Project ... NEED THIS PART

    static var previews: some View {
        NavigationView {
            List {
                PreProjectCell(project: <#Project#>)
            }
        }
    }
}
extension Project {
    static var preview: Self {
        let data = Data(jsonProj.utf8)
        //frmt
        let frmt2 = DateFormatter()
        frmt2.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSX"
        //decoder
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
            let container = try decoder.singleValueContainer()
            let dateStr = try container.decode(String.self)
            guard let d = frmt2.date(from: dateStr) else { fatalError() } //fixme some danger here
            return d
        })
        return try! decoder.decode(Self.self, from: data)
    }
}

然后在您的 SwiftUI 预览版中,您可以执行以下操作:

struct PreProjectCell_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            List {
                PreProjectCell(project: .preview)
            }
        }
    }
}