[Swift/SwiftUI] get, set, willSet, didSet

g4oo0·2025년 4월 7일

Swift

목록 보기
2/4

SwiftUI에서 get, set, willSet, didSet은 속성(Property) 과 관련된 개념으로, 데이터의 읽기/쓰기 및 변경 감지에 사용된다. Swift 언어의 일반적인 속성 개념이지만, SwiftUI에서는 데이터 바인딩, 상태 관리 등과 연결되어 특히 중요하다.


getset: 연산 프로퍼티 (Computed Property)

  • 읽기(get)쓰기(set) 를 정의해서, 값을 저장하지 않고 계산해서 반환하거나 설정할 수 있는 속성입니다.
struct ContentView: View {
    var age: Int = 20

    var isAdult: Bool {
        get {
            return age >= 19
        }
        set {
            print("새로운 isAdult 값: \(newValue)")
            age = newValue ? 20 : 15
        }
    }

    var body: some View {
        Text(isAdult ? "성인입니다" : "미성년자입니다")
    }
}
  • get: 값을 반환할 때 동작

  • set: 값을 설정할 때 동작 (newValue라는 기본 매개변수 사용)

✅ willSet과 didSet: 저장 프로퍼티 (Stored Property)의 변경 감지자

  • 저장 프로퍼티에 새로운 값을 할당하기 직전(willSet)또는 직후(didSet)에 호출된다
  • SwiftUI에서 상태 변화 감지, 디버깅 등에 유용하다
struct ContentView: View {
    @State private var name: String = "John" {
        willSet {
            print("이름이 곧 '\(newValue)'로 바뀔 예정입니다.")
        }
        didSet {
            print("이전 이름: \(oldValue), 새로운 이름: \(name)")
        }
    }

    var body: some View {
        VStack {
            Text("이름: \(name)")
            Button("이름 변경") {
                name = "Jane"
            }
        }
    }
}
  • willSet(newValue): 값이 바뀌기 직전 호출됨 (기본 파라미터 newValue)

  • didSet(oldValue): 값이 바뀐 직후 호출됨 (기본 파라미터 oldValue)

⚠️ 주의: @State, @Binding, @Published 등 속성 래퍼와 함께 사용할 때는 willSet, didSet이 잘 동작하지 않을 수 있다.
대신 .onChange(of:) 를 활용하는 게 SwiftUI에서는 더 안정적이다

.onChange(of: name) { newValue in
    print("name이 변경되었습니다: \(newValue)")
}

0개의 댓글