기어가더라도 제대로

[SwiftUI-기초] AppStorage - UserDefault 를 사용 본문

SwiftUI - 기초

[SwiftUI-기초] AppStorage - UserDefault 를 사용

Damagucci-juice 2022. 11. 5. 17:42
  • UserDefault 를 사용할 때 SwiftUI 에서 조금 간편하게 할 수 있는 property wrapper 
struct ContentView: View {
    @State private var tapCount = UserDefaults.standard.integer(forKey: "Tap")

    var body: some View {
        Button("Tap count: \(tapCount)") {
            tapCount += 1
            UserDefaults.standard.set(self.tapCount, forKey: "Tap")
        }
    }
}
  • UserDefault 에는 3가지 문제가 있습니다.
  • 첫째, 현행 2줄의 코드로 처리가 되는점
    • 저장은 set, 인출은 해당 데이터 타입을 불러옴 
  • 둘째, 처음에 앱을 실행할 때는 저 "Tap" 에 해당하는 키워드가 없을 텐데, 이때는 Int 타입의 경우 0으로 함
    • 그렇다면 Bool 타입의 경우엔 false 인데, 이 false 가 유저가 저장한 false 인지, 아니면 값을 설정한적이 없어서 나오는 false 인지 알 수가 없음
  • 셋째, 저장하는데 시간이 소요된다는 점
    • 앱을 실행하고, 버튼을 누른 후 즉시 xcode로 돌아와서 다시 앱을 구동하면 처음 구동할 때의 값이 나타남
    • 이는 UserDefault 의 경우 사용자가 전에 값으로 되돌리는 경우도 있고 해서, 즉시 값을 업데이트 시키지 않고 몰아서 업데이트하기 때문에 나타남
    • 이를 이용하는 것이 시스템 업데이트임.
      • 시스템 업데이트는 업데이트가 끝나면 즉시 컴퓨터를 종료시킴. 
      • 그래서 업데이트된 내용을 저장하는 과정을 처리하도록 함

AppStorage

  • UserDefault를 처리하는 property wrapper 
  • 저장하고 인출하는 과정을 할필요 없이 그냥 일반적인 변수 다루듯이 사용하면 됨
struct ContentView: View {
    @AppStorage("tapCount") private var tapCount = 0

    var body: some View {
        Button("Tap count: \(tapCount)") {
            tapCount += 1
        }
    }
}
  • 안에 "tapCount" 라는 키워드는 변수명과 같지 않아도 됨, 무엇이든 상관없음
  • UserDefault 와 연동된 @State 라고 생각해도 좋음
  • 근본적으로 UserDefault 를 사용하기 때문에, 위의 3가지 문제중 한가지밖에 해결하지 못함

 

Comments