Search code examples
swiftclassobjectdictionary

Can Swift convert a class / struct data into dictionary?


For example:

class Test {
    var name: String;
    var age: Int;
    var height: Double;
    func convertToDict() -> [String: AnyObject] { ..... }
}

let test = Test();
test.name = "Alex";
test.age = 30;
test.height = 170;

let dict = test.convertToDict();

dict will have content:

{"name": "Alex", "age": 30, height: 170}

Is this possible in Swift?

And can I access a class like a dictionary, for example probably using:

test.value(forKey: "name");

Or something like that?


Solution

  • You can just add a computed property to your struct to return a Dictionary with your values. Note that Swift native dictionary type doesn't have any method called value(forKey:). You would need to cast your Dictionary to NSDictionary:

    struct Test {
        let name: String
        let age: Int
        let height: Double
        var dictionary: [String: Any] {
            return ["name": name,
                    "age": age,
                    "height": height]
        }
        var nsDictionary: NSDictionary {
            return dictionary as NSDictionary
        }
    }
    

    You can also extend Encodable protocol as suggested at the linked answer posted by @ColGraff to make it universal to all Encodable structs:

    struct JSON {
        static let encoder = JSONEncoder()
    }
    extension Encodable {
        subscript(key: String) -> Any? {
            return dictionary[key]
        }
        var dictionary: [String: Any] {
            return (try? JSONSerialization.jsonObject(with: JSON.encoder.encode(self))) as? [String: Any] ?? [:]
        }
    }
    

    struct Test: Codable {
        let name: String
        let age: Int
        let height: Double
    }
    
    let test = Test(name: "Alex", age: 30, height: 170)
    test["name"]    // Alex
    test["age"]     // 30
    test["height"]  // 170