변수를 영구 저장하는 방법은 userdafaults를 사용하는 것이다.
서버에서 값을 받아왔다면 받아온 값을 userdafaults로 저장한다.
UserDefaults.standard.set(str, forKey: "userpkey")
그리고 이 변수를 사용하고 싶은 view에서 아래와 같은 과정을 거치면 된다.
먼저 변수 선언부에서 userdefaults변수를 선언한다.
@State var userpkey = UserDefaults.standard.integer(forKey: "userpkey")
변수를 Int, String처럼 userdefaults타입으로 선언하는 방식으로 보면 된다.
그리고 사용하고자 하는 곳에서 변수를 사용한다.
<사용 예시>
그러나 userdafults는 클라이언트 내부에서 계속 변수 값을 가지고 있으므로 보안상의 위험이 있다.
view간 변수를 전달하고 싶다면 아래와 같은 방법도 있다. 바로 @Binding변수를 사용하는 것이다.
Binding변수는 이전 뷰에서 전달해준 인자 값을 받아올 수 있는 상태의 변수로 한 뷰에서 변수 값을 받기도 하고 다시 전달하기도 하려먼 @State변수와 짝을 지어 사용해야 한다.
변수 선언
@Binding var b_time : Int
@State var s_time: Int = -1
state변수를 사용하기 위해 binding으로 받아온 변수를 state변수 값에 대입한다.
s_time = b_time
다시 전달하고자 하는 view링크에 인자를 전달해 준다.
.fullScreenCover(isPresented: $isActive, content: {
CCSurvey7View(b_surveytimepkey: $s_surveytimepkey, b_time: $s_time)
.transition(.move(edge: .leading))
})
preview에서 생기는 문법 오류를 수정하는 코드로는 아래를 사용한다.
struct CCSurvey6View_Previews: PreviewProvider {
static var previews: some View {
CCSurvey6View(b_time: .constant(-1))
}
}
💡 constant의 값은 변수가 가질 수 없는 값을 사용하는 것이 좋다.
(예)현재 시각을 저장하는 변수라면 -1값을 사용한다.
위와 같이 변수를 다른 view에서 사용할 수 있다. userdefaults는 사용이 간편하지만 보안상의 문제가 있고 변수를 넘기는 방식은 사용하고 싶은 뷰까지의 거리가 멀 때 사용하지 않는 뷰에서도 이 작업을 모두 해 주어야 하는 단점이 있다. 따라서 용도와 상황에 맞게 두 가지 방법을 적절히 사용하는 것이 좋다.😀
많은 것을 배웠습니다, 감사합니다.