I need to create a valid preview for UserView, which means I need to parse in an single User, which struct looks like this:
struct User: Codable, Hashable {
var id: UUID
var isActive: Bool
var name: String
var age: Int
var company: String
var email: String
var address: String
var about: String
var registered: Date
var tags: [String]
var friends: [Friend]
enum CodingKeys: String, CodingKey {
case id
case isActive
case name
case age
case company
case email
case address
case about
case registered
case tags
case friends
}
init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let dateFormatter = ISO8601DateFormatter()
let stringId = try container.decode(String.self, forKey: .id)
self.id = UUID(uuidString: stringId) ?? UUID()
self.isActive = try container.decode(Bool.self, forKey: .isActive)
self.name = try container.decode(String.self, forKey: .name)
self.age = try container.decode(Int.self, forKey: .age)
self.company = try container.decode(String.self, forKey: .company)
self.email = try container.decode(String.self, forKey: .email)
self.address = try container.decode(String.self, forKey: .address)
self.about = try container.decode(String.self, forKey: .about)
let stringRegistered = try container.decode(String.self, forKey: .registered)
self.registered = dateFormatter.date(from: stringRegistered) ?? Date()
self.tags = try container.decode([String].self, forKey: .tags)
self.friends = try container.decode([Friend].self, forKey: .friends)
}
func encode(to encoder: any Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.id.uuidString, forKey: .id)
try container.encode(self.isActive, forKey: .isActive)
try container.encode(self.name, forKey: .name)
try container.encode(self.age, forKey: .age)
try container.encode(self.company, forKey: .company)
try container.encode(self.email, forKey: .email)
try container.encode(self.address, forKey: .address)
try container.encode(self.about, forKey: .about)
try container.encode(self.registered.ISO8601Format(), forKey: .registered)
try container.encode(self.tags, forKey: .tags)
try container.encode(self.friends, forKey: .friends)
}
}
The simple approach
UserView(user: User(id: XXX, name: XXX ...))
does not work here, because of the custom codable initializer (which I need of course).
That's what Xcode suggests/expects:
UserView(user: User(from: <any Decoder> ))
The general code works perfectly fine, I just want to use the preview to design the UserView.
How can I create a valid User for preview?