There is an Optional Persisted propertyWrapper?


My Realm model is also codable, and theses properties can be null, but when I get the JSON from the serve and decode it. It’s not working because he doesn’t know map the optional value

I need to implement the decoder method to solve this. I don’t want to implement decoder to all my realm model

There is an optional persisted propertyWrapper @OptionalPersisted something like this?

1 Like

Which properties? Can you include the Realm Model you’re referring to and perhaps a brief segment of the JSON you’re working with? Also, a snippet of the code you’ve attempted would be very helpful in clarifying the question

My model:

class Supplier: Object, Coddle {
    @Persisted(primaryKey: true) var id: UUID =  UUID()
    @Persisted var name: String =  ""
    @Persisted var phoneNB: String?
    @Persisted var address: String?
    @Persisted var email: String?
    @Persisted var website: String?
    @Persisted var createdAt: Date = Date()

    convenience init(name: String, phoneNB: String?, address: String?, email: String?, website: String?) {
        self.init() = name
        self.phoneNB = phoneNB
        self.address = address = email = website

The JSON that I’m trying to parse


The error that I get
Decoded JSON error: valueNotFound(Swift.Optional<Swift.String>, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "phoneNB", intValue: nil)], debugDescription: "Expected Optional<String> but found null value instead.", underlyingError: nil))

It’s fail on phoneNB field. In my Realm model I marked it optional ?

To fix the error I need to implement manually the decoder method

    convenience required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(UUID.self, forKey: .id)
        name = try container.decode(String.self, forKey: .name)
        phoneNB = try container.decodeIfPresent(String.self, forKey: .phoneNB)
        address = try container.decodeIfPresent(String.self, forKey: .address)
        email = try container.decodeIfPresent(String.self, forKey: .email)
        website = try container.decodeIfPresent(String.self, forKey: .website)
        createdAt = try container.decode(Date.self, forKey: .createdAt)

I don’t want to add the method manually, I want to let the compier to synthesize it

Forgive the question but at first glance, the Realm object model Supplier doesn’t appear to match the presented JSON - the JSON data is a tier lower within a data child node. Perhaps there’s a third party library installed or more to it?

But the question is about the optional value so I simplified your json data just for testing with optionals to this:

let supplierJSONString = 


and then created a Realm Model to map it to

class Supplier: Object, Codable {
    @Persisted(primaryKey: true) var id: UUID =  UUID()
    @Persisted var name: String =  ""
    @Persisted var phoneNB: String?

and then some quick code to encode the JSON string and then decode it into the Realm object

    let jsonData = .utf8)!
    let response = try! JSONDecoder().decode(Supplier.self, from: jsonData)

and printed to console

Supplier {
	id = 477076BB-3114-4750-8E4F-042EF65B31E0;
	name = sup;
	phoneNB = (null);

So it looks like the optional is being set to NULL as it should.

Perhaps a bit more clarity in the question and model would help us narrow the issue?

Hi @Jay @Mickael_Belhassen

Is it feasible to make realm List as optional?



No, a Realm List cannot be optional. But why would you want that. If it contains no elements then it’s just an empty list, right?

Also, this question is about 3 years old - it may be better to start a new topic/question with more details about what you’re attempting to do.