1

Wondering if there is a way to decode some json into a Codable that is a dependency of a View so i can use swiftUI previews?

Here is a working unit test for the 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()
        }
    }

I'd like to use it here

struct PreProjectCell_Previews: PreviewProvider {

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

    static var previews: some View {
        NavigationView {
            List {
                PreProjectCell(project: <#Project#>)
            }
        }
    }
}

1 Answer 1

2
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)
    }
}

Then in your SwiftUI Preview you can do:

struct PreProjectCell_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            List {
                PreProjectCell(project: .preview)
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

nice 1. very swift!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.