SwiftUI는 선언적, 상태 중심의 프레임워크
- ViewHierarchy를 통해 View 참조 가능
- 이벤트에 대한 반응을 직접적으로 View로 변경 가능 → View에 바인딩 되어 있는 상태를 변화시킴.
- Delegates, target-actions, responder chain, KVO 등의 모든 callback 기술들은 closure와 binding으로 대체
SwiftUI에서 관리하는 값을 읽고 쓸 수 있는 속성 래퍼 유형
@State
프로퍼티 래퍼를 사용하여 선언됨private
으로 선언$
상태 프로퍼티는 선언된 뷰와 그 하위 뷰에 대한 현재 값
어떤 뷰가 하나 이상의 하위뷰를 가지고 있으며, 동일한 상태 프로퍼티에 대해 접근해야 하는 경우, @Binding
상태 프로퍼티를 이용
//
// StateDemoView.swift
// HMH_Practice
//
// Created by 지희의 MAC on 3/11/24.
//
import SwiftUI
struct StateDemoView: View {
@State private var wifiEnabled = true
@State private var username = ""
var body: some View {
VStack {
Toggle(isOn: $wifiEnabled, label: {
Text("EnableWifi")
})
TextField("Enter User Name", text: $username)
Text(username)
WifiImageView(wifiEnabled: $wifiEnabled)
}
}
}
struct WifiImageView: View {
@Binding var wifiEnabled: Bool
var body: some View {
Image(systemName: wifiEnabled ? "wifi" : "wifi.slash")
}
}
#Preview {
StateDemoView()
}
바인딩 된 wifiEnabled
의 값이 변할 때마다 뷰가 업데이트 됩니다. TextField에 작성하는 내용도 실시간으로 반영되는 것을 확인할 수 있습니다.