J
[SwiftUI] @AppStorage 본문
`@AppStorage`
SwiftUI에서 제공하는 속성 래퍼로, UserDefaults와 연동하여 간편하게 데이터를 저장하고 관리 가능.
`@AppStorage` 사용 시 특정 데이터가 앱 전체에서 공유되고, 앱을 종료해도 유지되는 속성을 쉽게 정의 가능.
이 래퍼는 특히 SwiftUI 뷰에서 사용자 설정, 앱 상태 등을 저장하고 불러오는 데 유용.
자동으로 상태 변화를 감지하고 UI를 업데이트하므로, UserDefaults와 직접 상호작용하는 것보다 편리.
1. 사용법
`@AppStorage`는 속성에 키와 기본값을 지정하여 사용.
내부적으로 UserDefaults에 접근하여 저장 및 조회를 수행하며, 데이터 타입은 UserDefaults에서 지원하는 `Bool`, `Int`, `Double`, `String`, `Data`를 사용.
사용법 예시
import SwiftUI
struct ContentView: View {
@AppStorage("username") var username: String = "Guest" // "username" 키로 저장된 값 사용
var body: some View {
VStack {
Text("Hello, \\\\(username)!")
Button("Change Username") {
username = "John Doe" // UserDefaults에 저장됨
}
}
.padding()
}
}
- `@AppStorage("username")`는 `username` 속성을 UserDefaults에 "username" 키로 저장.
- `"Change Username"` 버튼을 클릭하면 `username` 값이 UserDefaults에 저장되며, 화면도 업데이트.
- `@AppStorage`는 값이 변경될 때마다 해당 값을 자동으로 UserDefaults에 저장하고 UI를 업데이트.
2. @AppStorage의 내부 동작 원리
`@AppStorage`는 UserDefaults와 바인딩하여, UserDefaults에 저장된 값이 변경되면 SwiftUI가 이를 감지하여서 관련 뷰를 다시 렌더링하는 방식.
3. 데이터 타입과 기본값
- `@AppStorage`는 다양한 데이터 타입을 지원하며, 기본값을 지정하지 않으면 `nil`로 처리.
- UserDefaults와 동일하게 `Bool`, `Int`, `Double`, `String`, `Data` 등을 저장할 수 있음.
- Swift에서 UserDefaults에서 지원하지 않는 타입은 `Codable`을 사용해 `Data`로 변환하여 저장 가능.
데이터 타입 예시
struct SettingsView: View {
@AppStorage("isDarkMode") var isDarkMode: Bool = false
@AppStorage("volumeLevel") var volumeLevel: Double = 0.5
@AppStorage("userToken") var userToken: String?
@AppStorage("userAge") var userAge: Int = 18
var body: some View {
VStack {
Toggle("Dark Mode", isOn: $isDarkMode)
Slider(value: $volumeLevel, in: 0...1)
TextField("Token", text: $userToken ?? "")
Stepper("Age: \\\\(userAge)", value: $userAge)
}
}
}
- `Bool`: `isDarkMode`는 `@AppStorage`를 사용해 `Bool` 타입을 저장하고 읽어 옴.
- `Double`: `volumeLevel`은 슬라이더와 연동되어 UserDefaults에 `Double` 값을 저장.
- `String?`: `userToken`은 옵셔널 값으로, 기본값을 지정하지 않았으므로 `nil`일 수 있음.
- `Int`: `userAge`는 기본값 18로 초기화.
4. 주요 특징 및 사용 시 주의사항
- 자동 저장 및 업데이트:
- `@AppStorage`는 값이 변경되면 자동으로 UserDefaults에 저장되기에 앱이 종료되더라도 저장된 상태로 남음.
- SwiftUI의 `@State`와 비슷하게 상태 변경을 감지하여 뷰를 자동으로 재렌더링.
- 동기화 문제:
- `@AppStorage`는 UserDefaults를 사용하므로 앱 전역에서 공유하기에 앱의 여러 곳에서 동일한 키로 데이터를 사용하면 예상치 못한 동기화 문제가 발생할 수 있음.
- 같은 키를 사용하는 여러 속성 래퍼가 충돌하지 않도록 주의 필요.
- 성능 및 최적화:
- UserDefaults는 소량의 간단한 데이터를 저장하는 데 최적화.
- 큰 데이터나 빈번한 업데이트가 필요한 경우에는 다른 저장소(예: Core Data) 사용 권장.
5. 예제: 로그인 상태 저장하기
struct LoginView: View {
@AppStorage("isLoggedIn") var isLoggedIn: Bool = false
var body: some View {
VStack {
if isLoggedIn {
Text("Welcome back!")
Button("Log Out") {
isLoggedIn = false
}
} else {
Text("Please log in.")
Button("Log In") {
isLoggedIn = true
}
}
}
}
}
- 기능: `isLoggedIn` 상태를 `@AppStorage`로 정의하여 UserDefaults에 저장하고, 앱 재실행 후에도 유지.
- UI 업데이트: `isLoggedIn` 값이 변경될 때마다 자동으로 뷰를 업데이트해 로그인 상태에 맞는 화면으로.
'SwiftUI' 카테고리의 다른 글
[SwiftUI] SwiftUI + TCA: 최신 버전 TCA의 동작 과정 (예제 포함) (0) | 2024.07.05 |
---|---|
[SwiftUI] SwiftUI + TCA : Redux 패턴 영향? 단방향? (0) | 2024.06.30 |
[SwiftUI] @ObservableObject / @Published / @StateObject / @ObservedObject (0) | 2024.05.20 |
[SwiftUI] @ViewBuilder (0) | 2024.05.20 |
[SwiftUI] AsyncImage in SwiftUI (0) | 2024.05.13 |