utahiosmac / Marshal

Marshaling the typeless wild west of [String: Any]
MIT License
698 stars 63 forks source link

Expected type MarshaledObject for key: node. Got 'Optional<Any>' #145

Open JetForMe opened 3 years ago

JetForMe commented 3 years ago

I love Marshal and I'm a bit worried that maybe it's been abandoned, but hopefully you can help me with this:

I've lately started running into this error: Expected type MarshaledObject for key: node. Got 'Optional<Any>'. I can cast the object to [String:Any], but not to [MarshaledObject].

The failure is happening in Unmarshaling.swift:

extension Unmarshaling {

    public static func value(from object: Any) throws -> ConvertibleType {
        guard let convertedObject = object as? MarshaledObject else {
            throw MarshalError.typeMismatch(expected: MarshaledObject.self, actual: type(of: object))
        }
        guard let value = try self.init(object: convertedObject) as? ConvertibleType else {
            throw MarshalError.typeMismatch(expected: ConvertibleType.self, actual: type(of: object))
        }
        return value
    }

}

If I print the type of the object in the debugger, it's:

(lldb) po type(of: any)
Swift.Optional<Any>

In the debugger it looks like this:

Screen Shot 2021-06-23 at 18 12 07

Swift 5 in Xcode 13b, but also happens in 12.5.1

Thanks!

JetForMe commented 3 years ago

Yeah, I think problem is the Anys are actually Optional<Any>s, and Marshal doesn't like that. I’m not quite sure how to make it handle those.