코드네임 :

🍎 2주차 워크북 본문

👥Club/🍀UMC🍀

🍎 2주차 워크북

비엔 Vien 2025. 3. 24. 00:26

상태 프로퍼티 : 뷰의 데이터 변화 관리, 상태 변경될떄까지 UI를 자동으로 업뎃하는 역할
 

 

// 상위 뷰

import SwiftUI

struct ContentView: View {
    @State private var isClicked: Bool = false
    
    var body: some View {
        VStack{
            Text("현재 State 변수 값: \(isClicked)")
            
            CustomButton(isClicked: $isClicked)
        }
    }
}

#Preview {
    ContentView()
}
// 하위 뷰

import SwiftUI

struct CustomButton: View {
    
    @Binding var isClicked: Bool
    
    init(isClicked: Binding<Bool>) {
        self._isClicked = isClicked
    }
    
    var body: some View {
        Button(action: {
            isClicked.toggle()
            print("하위 뷰에서 값 변경함 : \(isClicked)")
        } ,label:{
            Text("상위 뷰의 값 State 값을 변경")
        })
    }
}

 

 
 
but!!! State의 단점


⬇️ 해결법 Observable 객체
@ObservedObject : 뷰가 직접 상태를 관리하는 것이 아니라, 상태를 따로 관리하는 객체를 만들고 그 변화를 감지하여 UI를 자동으로 갱신하는 방식 사용 (게시자와 구독자 간의 관계 사용하여 구축)
 
@Published 속성 래퍼

 
 
but 단점!!
뷰가 렌더링될 떄 기존의 상태를 유지하는것이 아닌 새로운 객체를 참조할 가능성이 있어 기존상태가 초기화 될 위험 존재

 
 

⬇️
@StateObject 

 

 
>> 최근의 방식 @Observable macro

/* viewModel */

import Foundation

@Observable
class CounterViewModel {
    var count = 0
}

 
>> @Bindable 방식
@Observable 매크로가 걸려있을때만 사용 가능
 

 


EnvironmentalObject
동일한 전역객체를 사용한다
( =• 상위 View(부모)에서 하나의 UserViewModel 인스턴스를 만든 다음
• 여러 하위 View(자식)에서 그 하나의 인스턴스를 같이 가져다 쓰는 것이야.)


 
@AppStorage

@AppStorage("username") var username: String = "Guest"

위 코드는 기본 형태입니다. “userName”이라는 키에 해당하는 값이 **UserDefaults**에 저장됩니다.
앱을 종료하고 다시 실행해도 “userName” 키의 값은 유지 됩니다.


GeometryReader
GeometryReader는 뷰의 크기와 위치를 동적으로 계산할 수 있는 SwiftUI의 강력한 도구입니다.
뷰의 부모 컨테이너 크기에 따라 동적으로 레이아웃을 조정할 수 있도록 도와줍니다.