@State
로 선언된 변수의 값이 변할 때 View를 다시 계산하여 출력private
@State
속성으로 프로퍼티의 초기값을 설정했다면 다른 값으로 재할당 불가@Binding
변수를 통해서 가능import SwiftUI
struct ContentView: View {
@State private var isEnabled: Bool = false
var body: some View {
VStack{
Text(isEnabled ? "True" : "False")
Button(action: {
isEnabled.toggle()
}, label: {
Text(isEnabled ? "False" : "True")
})
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
❗️ 만일 isEnabled
변수를 @State 프로퍼티로 지정해주지 않는다면 ?
→ self 변수는 변할 수 없는 값이므로, 사용할 수 없다는 error 발생
@State
로 선언된 속성을 다른 View에서 사용하기 위해서 @Binding
사용$
를 통해 Binding 변수임을 표시@State
로 선언된 속성에 변경이 생기면 @Binding
변수에서 인지하고 해당 값에 따른 View 변화를 반영private
으로 선언하지 않는다.import SwiftUI
struct ContentView: View {
@State private var isEnabled: Bool = false
var body: some View {
VStack{
Text(isEnabled ? "True" : "False")
Toggle(isOn: $isEnabled, label: {
Text(isEnabled ? "False" : "True")
})
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
import SwiftUI
struct ContentView: View {
@State private var isEnabled: Bool = false
var body: some View {
VStack{
HStack{
Text("Value: ")
Text(isEnabled ? "True" : "False")
}
NavigationView {
NavigationLink("check"){
CheckView(isEnabled: self.$isEnabled)
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct CheckView: View{
@Binding var isEnabled: Bool
var body: some View {
Toggle(isOn: $isEnabled, label: {
Text(isEnabled ? "True" : "False")
})
.padding()
}
}
Observable object를 구독하고, Observable object가 변할 때마다 view를 무효화한다.
감시 대상 클래스 변수에 선언
@Published
선언struct ContentView: View {
@Environment(\.layoutDirection) var layoutDirection
var body: some View {
if layoutDirection == .leftToRight {
return Text("Left to Right")
} else {
return Text("Right to Left")
}
}
}
Environment는 시스템에서 제공하는 것만 사용할 수 있는 것이 아닌, 사용자가 직접 앱에 필요한 변수를 추가하고 활용할 수 있다.
private struct CaptionColorKey: EnvironmentKey {
static let defaultValue = Color(.secondarySystemBackground)
}
extension EnviromentValues {
var captionBackgroundColor: Color {
get { self[CaptionColorKey.self] }
set { self[CaptionColorKey.self] = newValue }
}
}
ContentView()
.environment(\.captionBackgroundColor, .yellow)