Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

J

[SwiftUI] @AppStorage 본문

SwiftUI

[SwiftUI] @AppStorage

yujaehui 2024. 5. 23. 23:29

`@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. 주요 특징 및 사용 시 주의사항

  1. 자동 저장 및 업데이트:
    • `@AppStorage`는 값이 변경되면 자동으로 UserDefaults에 저장되기에 앱이 종료되더라도 저장된 상태로 남음.
    • SwiftUI의 `@State`와 비슷하게 상태 변경을 감지하여 뷰를 자동으로 재렌더링.
  2. 동기화 문제:
    • `@AppStorage`는 UserDefaults를 사용하므로 앱 전역에서 공유하기에 앱의 여러 곳에서 동일한 키로 데이터를 사용하면 예상치 못한 동기화 문제가 발생할 수 있음.
    • 같은 키를 사용하는 여러 속성 래퍼가 충돌하지 않도록 주의 필요.
  3. 성능 및 최적화:
    • 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` 값이 변경될 때마다 자동으로 뷰를 업데이트해 로그인 상태에 맞는 화면으로.