iOS에서는 앱의 화면을 일반적으로 scene(씬, 장면)이라고 부름.
@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에 저장 가능한 데이터 타입 모두 저장 가능