티스토리 뷰
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
TAG
- Kotlin
- rxswift
- intellij
- Codable
- SWIFT
- Python
- git
- Linux
- cocoapods
- ios
- MySQL
- tomcat
- github
- ubuntu
- nodejs
- go
- windows10
- centos8
- Windows
- Spring
- golang
- war
- Xcode
- php
- enum
- Java
- CentOS
- Gradle
- android
- docker
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함