How can I get all writable keypaths from a Swift struct programatically?

741 Views Asked by At

I'm trying to convert a `struct1 to Realm objects right now. Realm object has same keypath with original struct. so If I can get all writable keypaths from original struct, it is possible to convert with general method.

public protocol KeyPathListable {
    var allKeyPaths:[WritableKeyPath<Self, Any>]  { get }
}

extension KeyPathListable {
    private subscript(checkedMirrorDescendant key: String) -> Any {
        return Mirror(reflecting: self).descendant(key)!
    }
    var allKeyPaths:[WritableKeyPath<Self, Any>] {
        var membersTokeyPaths = [WritableKeyPath<Self,Any>]()
        let mirror = Mirror(reflecting: self)
        
        for case (let key?, _) in mirror.children {
            if let keyPath = \Self.[checkedMirrorDescendant: key] as? WritableKeyPath<Self, Any> {
                membersTokeyPaths.append(keyPath)
            }
        }
        return membersTokeyPaths
    }
}

Just found the code snippet above but it returns KeyPath(not WritableKeyPath). I tried to typecast in this case, but it returns nil. Maybe mirror function has problem. Is there any solution for that?

0

There are 0 best solutions below