본문 바로가기
iOS/설명

[iOS] Mirror Struct

by Sky Titan 2024. 2. 24.
728x90

https://zeddios.tistory.com/943

 

Swift ) Mirror

안녕하세요 :) Zedd입니다. 요새 왜이렇게 바쁜지 모르겠어요 @0@... 운동을 하면 체력이 더 좋아져서 다 해버릴 수 있을것만 같았는데 그런것도 아니네요. 하하 오늘은 Mirror에 대해서 공부해보려

zeddios.tistory.com

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

 

Mirror | Apple Developer Documentation

A representation of the substructure and display style of an instance of any type.

developer.apple.com

 

 

Mirror

  • 정의: 어떤 타입의 instance의 하위 구조의 표현
  • Mirror는 stored property나 tuple, collection과 같은 instance의 특정 부분들을 묘사한다.
  • Mirror는 display style이라는 property를 제공해서 이 mirror가 어떻게 rendering 될지에대해서도 알려준다
  • reflection:
    • 프로그래밍 언어의 기능 중 하나로, 런타임에 type이 가지고 있는 멤버들을 검사할 수 있는 기능이다.

 

 정의는 조금 어렵게 표현되어있지만 쉽게 말해서 내가 어떤 타입의 instance가 어떤 property들을 가지고 있는지를 collection형태로 찾아볼 수 있게 해주고 또한 내가 어떤 형태의 type인지도 알 수 있게 해준다.

 

children

  • instance가 가지고 있는 stored property들의 collection
  • 가지고 있는 property들의 이름, 그리고 value들에 대해서 받아올 수 있다.
  • 다만 stored property들에 대한 정보만 가져오고 computed property의 정보는 가져올 수 없다.
struct TestClass {
    let x: Int
    let y: Int
    let list: [Int]
    
    var z: Int {
        return x + y
    }
}

let test = TestClass(x: 0, y: 1, list: [0, 1, 2])
let mirror = Mirror(reflecting: test)


print("count of child: \(mirror.children.count)")
mirror.children.forEach { child in
    print("label: \(child.label), value: \(child.value)")
    
    if child.value is Int {
        print("It is Integer")
    } else if child.value is Array<Int> {
        print("It is Array")
    }
}
/*
 count of child: 3
 label: Optional("x"), value: 0
 It is Integer
 label: Optional("y"), value: 1
 It is Integer
 label: Optional("list"), value: [0, 1, 2]
 It is Array

 */

 

 

displayStyle

  • enumeration으로 되어 있고 reflection한 instance가 어떤 type인지 알려준다

struct TestStruct {
    let x: Int
    let y: Int
    let list: [Int]
    
    var z: Int {
        return x + y
    }
}

class TestClass {
    
}
let test = TestStruct(x: 0, y: 1, list: [0, 1, 2])
let testClass = TestClass()
let mirror = Mirror(reflecting: test)
let classMirror = Mirror(reflecting: testClass)
print(mirror.displayStyle)
print(classMirror.displayStyle)
/*
 Optional(Swift.Mirror.DisplayStyle.struct)
 Optional(Swift.Mirror.DisplayStyle.class)
 */

 

기능을 잘만 활용한다면 내가 가지고 있어야 하는 다수의 값들을 collection형태의 단일 property로 선언할 필요 없이 각각의 element들은 property로 선언하여 좀 더 직관적으로 파악할 수 있게 활용할 수도 있을 것 같다.

728x90

댓글