Mobile/iOS
Swift. reflection.
out of coding
2018. 6. 24. 23:34
Swift에서는 Reflection을 사용하는 방법에 대해서 알아봅시다.
이게 무슨 의도에서 찾게 되었냐면, Swift의 Codable의 원리에 대해서 생각하게 되었고,
뭐 당연스럽게 다른 언어에도 있는 Reflection이 있을 것이라는 생각에서 찾아보았습니다.
본문이 길지 않은 점 이해 바랍니다.
1 2 3 4 5 6 7 8 9 10 11 12 | struct Test { var name: String var age: Int } let test = Test(name: "DH", age: 30) let mirror = Mirror(reflecting: test) for case let (label?, value) in mirror.children { print("label = \(label), value = \(value)") } | cs |
Test라는 struct를 만들었습니다.
아주 단순하게 이름과 나이?를 가져오는 구조체 입니다.
아래에 객체를 생성하고 이것을 가지고 키값과 값값을 가져옵니다.... 졸려서 그런지 정말 저질로 적은거 같은...
나중에 좀 고칠게요...
보이는거처럼 아주 단순하게 객체를 Mirror에 넣어주게 되면 그것의 children을 가져와서 사용할 수 있습니다.
1 2 | label = name, value = DH label = age, value = 30 | cs |
이것을 다음과 같이 변형을 하여서 출력을 할 수 있습니다. customMirror를 구체화 시키면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | struct Test { var name: String var age: Int } extension Test: CustomReflectable { var customMirror: Mirror { return Mirror.init(Test.self, children: ["aaa": name, "age": age]) } } let test = Test(name: "DH", age: 30) let mirror = Mirror(reflecting: test) for case let (label?, value) in mirror.children { print("label = \(label), value = \(value)") } | cs |
name의 label을 aaa로 변경하여서 출력하였습니다.
출력 값은 다음과 같음.
1 2 | label = aaa, value = DH label = age, value = 30 | cs |
직접적으로 가져오는것도 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 | struct Test { var name: String var age: Int } let test = Test(name: "DH", age: 30) let mirror = Mirror(reflecting: test) if let value = mirror.descendant("name") { print("name = \(value)") } | cs |
출력값은 이래요.
1 | name = DH | cs |
당장은 필요가 없지만 필요한곳이 있을것 같아서 적어둡니다.