ios 앱 개발 체제가 SWIFTUI로 많이 옮겨가면서 바뀐 문법에 적응할 시간이 필요해졌다. 앱 개발에서 필수적인 것 중 하나가 바로 view간 변수 전달인데 여기에는 여러 방법이 있다. 하나는 영구적인 저장이고 다른 하나는 navigation view로 연결되어 있는 view끼리만 전달할 수 있는 변수 사용 방식이다.

view간의 변수 전달은 사용자 정보를 DB에 저장하는 것과 별개로 클라이언트 내부에서 로그인한 사용자의 정보를 알고 있어야 할 필요성에서 온다.


변수를 영구 저장하는 방법은 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는 사용이 간편하지만 보안상의 문제가 있고 변수를 넘기는 방식은 사용하고 싶은 뷰까지의 거리가 멀 때 사용하지 않는 뷰에서도 이 작업을 모두 해 주어야 하는 단점이 있다. 따라서 용도와 상황에 맞게 두 가지 방법을 적절히 사용하는 것이 좋다.😀

profile
호기심으로 시작해, 논리적으로 개발하는, 백엔드 개발자 임지희 입니다. 소개에 있는 포트폴리오 및 github에서 프로젝트 상세내용과 코드를 보실 수 있습니다:)

1개의 댓글

comment-user-thumbnail
2023년 8월 13일

많은 것을 배웠습니다, 감사합니다.

답글 달기