SwiftUI의 @SceneStorage

June·2023년 2월 9일
1

SwiftUI-Data

목록 보기
5/12
post-thumbnail

Scene?

iOS에서는 앱의 화면을 일반적으로 scene(씬, 장면)이라고 부름.


@SceneStorage?

@SceneStorage 프로퍼티 래퍼는 어떤 하나의 씬에 저장된 데이터를 그대로 유지함.
예를 들어, 유저가 앱 내부에 어떤 정보를 입력하다가 잠시 중단하고 다른 일을 하느라 해당 정보를 저장하는 것을 잊고 앱을 종료했다고 하자. 이후에 앱을 다시 실행하면 입력하던 그 정보는 사라져 있을 것이다.
이 때 @ScensStorage를 사용하면 그 데이터는 사라지지 않고 유지된다.


코드

import SwiftUI 

struct SecneStorageView: View {
    @State private var textInput = ""
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: WhatIsSceneStorage()) {
                    Text("다음 화면으로")
                        .font(.title)
                }
                .navigationTitle("@SceneStorage란?")
                
            }
        }
    }
}

struct WhatIsSceneStorage: View {
    
    // @SceneStorage에 "textInput"이라는 키 제공
    @SceneStorage("textInput") var textInput = ""
    @State var stateText = ""
    
    var body: some View {
        VStack(spacing: 20) {
            
            // @SceneStorage 사용
            DescriptionView(desc: "@SceneStorage를 사용하면 데이터가 저장됨. 이전 화면으로 돌아갔다 다시 진입해도 textInput에 입력한 내용이 그대로 보여지는 것을 볼 수 있음.")
            TextEditor(text: $textInput)
                .border(Color.orange)
                .padding(.horizontal)
            
            // @State 사용
            DescriptionView(desc: "@State를 사용시 데이터 저장되지 않음. 이전 화면으로 돌아갔다 다시 진입하면 textInput에 입력했던 내용은 사라지는 것을 볼 수 있음.")
            TextEditor(text: $stateText)
                .border(Color.orange)
                .padding(.horizontal)
        }
    }
}

struct DescriptionView: View {
    var desc = ""
    
    var body: some View {
        Text(desc)
            .frame(maxWidth: .infinity)
            .background(Color.orange)
            .padding()
    }
}

위 코드를 실행해 @SceneStorage와 @State 사용시 어떤 차이가 있는지 확인해 보자.
주석에 적힌 대로, @SceneStorage를 사용하면 데이터가 저장된다. 때문에 화면에 재진입해도 입력한 데이터는 사라지지 않고 남아 있다.
하지만 @State를 사용했을 땐 입력했던 데이터가 사라진 것을 볼 수 있다.


저장 가능한 데이터 타입?

@AppStorage에 저장 가능한 데이터 타입 모두 저장 가능

  • URL
  • Int
  • Bool
  • Double
  • String
  • Data

값 변경과 삭제

  • 값 변경은 원하는 대로 얼마든지 가능.
  • 값 삭제는 모름. (아시는 분 있으면 알려주세요..🥲)

주의사항

  • 저장하려는 데이터의 크기가 가벼워야 함. 모델 데이터와 같이 크기가 큰 데이터는 성능이 저하될 수 있기 때문에 피하기.
  • 중요한 데이터를 저장하지 말 것.
profile
안다고 착각하지 말기

0개의 댓글