๋ฐ์ํ
Property Wrappers
property wrapper๋ ํ๋กํผํฐ์ custom ํ ๋์์ ์ถ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
ํ๋กํผํฐ์ ๋ํ ์ ๊ทผ์ ๋ํ ํ์ฌ ์ถ๊ฐ ๋ก์ง์ด๋ ๋์์ ์บก์ํ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ, ๊ฐ๋ ์ฑ ๋ฐ ์ ์ง ๋ณด์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
@State
- view์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- view ๋ด๋ถ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก view๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ๊ฐ๋ณ ๊ฐ์ผ๋ก ์ทจ๊ธ๋๋ฉฐ, ๋ทฐ๊ฐ ์์ฑ๋ ๋ ํด๋น ๊ฐ์ด ์ด๊ธฐํ๋๊ณ , ์ฌ์ฉ์ ์ํธ ์์ฉ ๋๋ ์ธ๋ถ ์ด๋ฒคํธ์ ๋ฐ๋ผ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ๋ทฐ ๋ด๋ถ์์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ private์ผ๋ก ์ ์ธํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
import SwiftUI
struct ContentView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1
}
}
}
}
@Binding
- ๋ฐ์ดํฐ์ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์์ @State ๋ณ์๋ฅผ ์ ๋ฌ๋ฐ์ ํ์ ๋ทฐ์์ ์บ์นํด ๋ณํ ๊ฐ์ง ๋ฐ ์ฐ๊ฒฐํฉ๋๋ค.
- ํ๋์ ์์ค์์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๊ณณ์ ์ ํํ ์ ์์ต๋๋ค.
- Binding์ ๋ค๋ฅธ ๋ทฐ๊ฐ ์์ ํ ์์ฑ์ ์ฐ๊ฒฐํ๊ธฐ์ ์์ ๊ถ ๋ฐ ์ ์ฅ ๊ณต๊ฐ์ด ์์ต๋๋ค.
๋ถ๋ชจ๋ทฐ
import SwiftUI
struct ParentView: View {
@State private var value = 0
var body: some View {
ChildView(value: $value)
}
}
์์๋ทฐ
import SwiftUI
struct ChildView: View {
@Binding var value: Int
var body: some View {
Button("Increment") {
value += 1 // ๋ถ๋ชจ ๋ทฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝ
}
}
}
@Published
- ObservableObject๋ก ๊ตฌํํ ํด๋์ค ๋ด์์ ํ๋กํผํฐ ์ ์ธ ์ ์ฌ์ฉํฉ๋๋ค.
- Published๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ฅผ ๋ทฐ์์ ๊ด์ฐฐ ๊ฐ๋ฅํฉ๋๋ค.
- Published๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ ๋ณ๊ฒฝ์ฌํญ์ ๊ด์ฐฐํ๊ณ ์๋ ๋ชจ๋ ๋ทฐ์ ์๋ ค์ฃผ๋ฉฐ, ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋์ผ๋ก ๋ทฐ๋ค์ ์ ๋ฐ์ดํธํฉ๋๋ค.
@ObservedObject
- ๋ทฐ์์ ObservableObject ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ ์ธ ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ObservableObject๋ฅผ ์ค์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ทฐ์ ๋ฐ์ธ๋ฉํ์ฌ ํด๋น ๊ฐ์ฒด์ ์ํ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋ฉด ์๋์ผ๋ก ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
import SwiftUI
class Model: ObservableObject {
@Published var data: String = ""
func updateData(newData: String) {
data = newData
}
}
struct ContentView: View {
@ObservedObject var model = Model()
var body: some View {
VStack {
Text("Data: \(model.data)")
Button("Update Data") {
model.updateData(newData: "New Data")
}
}
}
}
@StateObject
- ๋ทฐ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ Property Wrappers์ ๋๋ค.
- ๋ทฐ์์ ObservableObject ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ ์ธ ์ ์ฌ์ฉํฉ๋๋ค.
- ๋ทฐ๋ง๋ค ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉฐ, ๋ทฐ๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ ๊น์ง ๊ฐ์ ์ธ์คํด์ค ์ ์งํฉ๋๋ค.
- ObservedObject์ ๋ทฐ ๋ ๋๋ง ์ ์ธ์คํด์ค ์ด๊ธฐํ ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋๋ค.
- SwiftUI๊ฐ ๋ทฐ์ ์ํ๋ฅผ ์ถ์ ํ๊ณ ์ ์ ํ๊ฒ ๊ด๋ฆฌํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ๋งค๋ฒ ์ธ์คํด์ค๊ฐ ์๋กญ๊ฒ ์์ฑ๋๋ ๊ฒ์ฒ๋ผ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋ ์ต์ด ์์ฑ ์ ์ธ ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค.
import SwiftUI
class ViewModel: ObservableObject {
@Published var count: Int = 0
func increment() {
count += 1
}
}
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack {
Text("Count: \(viewModel.count)")
Button("Increment") {
viewModel.increment()
}
}
}
}
@Environment
- SwiftUI ํ๊ฒฝ ๋ณ์์ ์ ๊ทผํ์ฌ ํด๋น ๋ณ์๋ฅผ ์ฝ๊ฑฐ๋ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฌ์ฉํ๋ ค๋ ๊ณต์ ๋ฐ์ดํฐ์ ์ด๋ฆ์ keyPath๋ก ์ ๋ฌํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- ์์คํ ๊ณต์ ๋ฐ์ดํฐ๋ ๊ฐ๋ณ ํ๊ธฐ์ var๋ก ์ ์ธ ํ์ํฉ๋๋ค.
- ๋ทฐ๊ฐ ์์ฑ๋๋ ์์ ์ ๊ฐ์ด ์๋์ผ๋ก ์ด๊ธฐํ๋ฉ๋๋ค.
import SwiftUI
struct ContentView: View {
@Environment(\.colorScheme) var colorScheme
var body: some View {
Text("Current color scheme: \(colorScheme)")
}
}
@EnvironmentObject
- SwiftUI ํ๊ฒฝ์์ ์ฃผ์ ๋ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฑฐ๋ ์ฌ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฑ์ ์ฌ๋ฌ ๋ทฐ์์ ๋์ผํ ๊ฐ์ฒด์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํตํด ์ ํํ ์ ์์ผ๋ฏ๋ก, ๋ฐ์ดํฐ๋ฅผ ์ ์ญ์ ์ผ๋ก ๊ณต์ ํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- @EnvironmentObject๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํด๋น ๊ฐ์ฒด๊ฐ ์ฑ์ ์์ ๋ทฐ ๊ณ์ธต์์ environmentObject(_:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฒฝ์ ์ฃผ์ ๋์ด์ผ ํฉ๋๋ค.
import SwiftUI
class UserData: ObservableObject {
@Published var username = "Guest"
}
struct ContentView: View {
@EnvironmentObject var userData: UserData
var body: some View {
VStack {
Text("Welcome, \(userData.username)!")
EditUsernameView()
}
}
}
struct EditUsernameView: View {
@EnvironmentObject var userData: UserData
var body: some View {
TextField("Username", text: $userData.username)
}
}
struct MainView: View {
var body: some View {
ContentView().environmentObject(UserData())
}
}
๋ฐ์ํ
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] Text (0) | 2024.04.18 |
---|---|
[SwiftUI] Stack (VStack/HStack/ZStack) (0) | 2024.04.08 |
[๋น๋๊ธฐ ์ฒ๋ฆฌ] ๋น๋๊ธฐ ์ฒ๋ฆฌ๋? (0) | 2023.09.18 |
[SwiftUI] SwiftUI๋? (0) | 2023.03.15 |
Pinch Gesture (0) | 2023.01.13 |