SwiftUI

SwiftUI - AppStorage

GREEN.1229 2024. 3. 7. 19:10

안녕하세요. 그린입니다 🍏

이번 포스팅에서는 SwiftUI에서 사용되는 AppStorage에 대해 학습해보겠습니다 🙋🏻

 

이번 포스팅의 내용은 UserDefaults를 안다는 가정하에 진행하며, 내용은 짧습니다ㅎㅎ


AppStorage?

AppStorage는 UserDefaults로 부터 값을 반영하고 값 변경에 대한 뷰를 무효화하는 프로퍼티 래퍼로 사용되는 구조체입니다.

iOS 14이후부터 사용할 수 있고 구현된 정의는 아래와 같습니다.

즉, 쉽게 생각하면 UserDefaults의 SwiftUI용이라고 보면 됩니다.

@frozen @propertyWrapper
struct AppStorage<Value>

 

기본적인 이니셜라이저 형태는 이러해요.

init(
    wrappedValue: Value,
    _ key: String,
    store: UserDefaults? = nil
) where Value == String

 

키로 저장하는것이 유저디폴츠를 사용했다면 아주 익숙하게 문자열 키 형태로 저장합니다.

그리고 이 기본값에는 다양한 기본 타입들이 올 수 있어요.

문자열, 정수, URL, Bool 등 말이죠.

 

또한, @AppStorage는 기본적으로는 UserDefaults.standard로 지정되지만 이 store에 특정하게 앱 그룹을 지정할 수도 있습니다.

이런식으로 말이죠.

@AppStorage("age", store: UserDefaults(suiteName: "green")) var age: Int = 3

 

즉, 기본적으로 store는 nil로 딱히 지정하지 않아도 되지만 특정하게도 사용이 가능하다는것이죠.

 

실제로 이렇게 사용될 수 있습니다.

 

import SwiftUI

enum MyEnum: Int {
  case a
  case b
  case c
}

struct MyView: View {
  @AppStorage("MyEnumValue") private var value = MyEnum.a
  
  var body: some View {
    ...
  }
}

 

그렇기에 이 프로퍼티 래퍼의 값은 앱에서 전역적으로 데이터 공유가 가능하고 하위 뷰들에도 바인딩값으로 전달하고 연결할 수 있습니다.

또한, 유저디폴츠처럼 앱이 삭제되기전에는 앱을 종료했다 다시 실행해도 값이 유지가 되죠!

 

조금 더 쉬운 예시로 실제 어떻게 사용될 수 있는지 볼까요?

 

import SwiftUI

struct MyView: View {
  @AppStorage("age") private var age: Int = 10
  
  var body: some View {
    VStack {
      Text("\(age)")
      
      ChildView($age)
    }
  }
}

struct ChildView: View {
  @Binding var age: Int

  var body: some View {
    Text("Age: \(age)")
  }
}

 

이렇게 쉽게 Int 타입의 공유 값을 사용한다면 하위에도 바인딩으로 넘겨줄 수도 있습니다.

물론, 하위뷰에서 AppStorage 값을 초기화 하지 않고 선언하여 사용하여도 무방해요.

초기화하지 않아도 이미 유저디폴츠의 기본값이나 변경이 된 값으로 들어있으니까요!

 

이 AppStorage는 DynamicProperty라는 프로토콜을 준수하고 있습니다.

DynamicProperty는 뷰의 외부 속성을 업데이트하는 저장 변수에 대한 인터페이스를 제공해줘요.

즉, 뷰는 뷰의 바디를 다시 계산하여 그려지기전에 이러한 속성에 값을 제공합니다.

 

마지막으로 해당 AppStorage를 사용할때 주의할 부분이 있어요.

UserDefaults와 마찬가지겠지만, 보안된 저장소가 아니기때문에 비교적 라이트한 값에 대해서만 사용하는것이 좋습니다.

유저의 개인정보들을 여기에 담으면 안되겠죠?

추출이 아주아주 쉽기때문에 사용에 주의해야합니다.

 


마무리

되게 간단하게 AppStorage에 대해 알아봤는데요.

간단하게 사실입니다 😃

저는 사실 그렇게 많이 사용은 하지 않지만, 정말 라이트한 부분들을 전역적으로 공유한다는 측면에서는 활용될만합니다.

 


레퍼런스

 

AppStorage | Apple Developer Documentation

A property wrapper type that reflects a value from and invalidates a view on a change in value in that user default.

developer.apple.com