관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Mirror 개념, Mirror(reflecting:) 본문

iOS 응용 (swift)

[iOS - swift] Mirror 개념, Mirror(reflecting:)

jake-kim 2023. 2. 11. 23:59

Mirror 개념

  • mirror 의미: 인스턴스의 *display style과 하위 정보를 표현하는 구조체를 의미
    * display style: struct인지, class인지, enum인지 구분을 위한 값
  • 쉽게 말해서, Mirror는 특정 인스턴스의 타입, 그 인스턴스의 하위 값(인스턴스, 메소드 등)의 정보를 가지고 있는 것

  • display style이란?
    • Mirror 내부에서 정의한 switch case 문
    • struct, class, enum, tuple 구분을 위한 값
    public enum DisplayStyle : Sendable {
        case `struct`
        case `class`
        case `enum`
        case tuple
        case optional
        case collection
        case dictionary
        case set

        public static func == (a: Mirror.DisplayStyle, b: Mirror.DisplayStyle) -> Bool
        public func hash(into hasher: inout Hasher)
        public var hashValue: Int { get }
    }

Mirror에서 알면 좋은 것

* 예제에 사용할 struct

struct ExampleStruct {
    enum InnerEnum {
        case a
    }
    
    let name = "jake"
    let innerEnum = InnerEnum.a
}
  • 생성자 - Mirror(reflecting:)
    • reflecting에 인스턴스를 주입하여 구하기
let exampleStruct = ExampleStruct()
let mirror = Mirror(reflecting: exampleStruct)
  • subjectType 인스턴스: 주입한 인스턴스의 타입
print(mirror.subjectType) 
// ExampleStruct
  • displayStyle 인스턴스: 인스턴스의 타입 키워드 반환 (class, enum, tuple, struct..)
print(mirror.displayStyle) 
// Optional(Swift.Mirror.DisplayStyle.struct)
  • children 인스턴스: 위에서 Mirror 생성자에 넣어준 인스턴스의 하위 정보에 대한 표현
print(mirror.children)
// AnyCollection<(label: Optional<String>, value: Any)>

mirror.children을 보면? -> ExampleStruct 프로퍼티들에 대한 정보를 출력

mirror.children
    .forEach { child in
        print(child.label, "=", child.value)
    }

// Optional("name") = jake
// Optional("innerEnum") = a

* 전체 코드: https://github.com/JK0369/ExMirror

 

* 참고

https://developer.apple.com/documentation/swift/mirror

Comments