티스토리 뷰

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


당장은 필요가 없지만 필요한곳이 있을것 같아서 적어둡니다.

'Mobile > iOS' 카테고리의 다른 글

Swift. 접근 한정자  (0) 2018.06.25
cocoapods. Library 등록 하기  (0) 2018.06.25
Swift. Custom ViewController Transition. Present  (0) 2018.06.24
RxSwift. Observable combine  (0) 2018.06.19
RxSwift. Transforming Observable  (0) 2018.06.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함