Language/Swift

[SwiftUI] @appstorage

jaewpark 2022. 9. 8. 21:15

@appstorage (참고)

: UserDefaults의 값을 반영하고 해당 사용자 기본값의 값 변경에 대한 보기를 무효화하는 Property Wrapper 유형입니다.

 

appstorage를 알고 싶은 거였는데, 모르는 단어 UserDefaultsProperty Wrapper가 나왔습니다.

간단하게 설명을 하고 넘어가도록 하겠습니다. 

 


UserDefaults (참고)

앱을 실행하는 동안 지속적으로 키-값 쌍을 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스입니다.

UserDefaults는 앱을 종료한 다음 다시 실행해도 그대로 유지되므로 앱 구성 데이터를 저장하는 데 이상적인 방법입니다.

let defaults = UserDefaults.standard
defaults.set(25, forKey: "Age")
defaults.set(true, forKey: "UseTouchID")
defaults.set(CGFloat.pi, forKey: "Pi")

let array = ["Hello", "World"]
defaults.set(array, forKey: "SavedArray")


/* ----------------------------------------- */

let age = defaults.integer(forKey: "Age")
let useTouchID = defaults.bool(forKey: "UseTouchID")
let pi = defaults.double(forKey: "Pi")

let savedArray = defaults.object(forKey: "SavedArray") as? [String] ?? [String]()
  • integer(forKey:)키가 있으면 정수를 반환하고 없으면 0을 반환합니다.
  • bool(forKey:)키가 있으면 부울을 반환하고 없으면 false를 반환합니다.
  • float(forKey:)키가 있으면 float를 반환하고, 없으면 0.0을 반환합니다.
  • double(forKey:)키가 있으면 double을 반환하고, 없으면 0.0을 반환합니다.
  • object(forKey:)반환 AnyObject?하므로 데이터 유형에 조건부로 유형 변환해야 합니다.
참고

 


Property Wrapper (참고)

속성 래퍼는 속성이 저장되는 방식을 관리하는 코드와 속성을 정의하는 코드 사이에 분리 계층을 추가합니다.

//@propertyWrapper
//struct TwelveOrLess {
//    private var number = 0
//    var wrappedValue: Int {
//        get { return number }
//        set { number = min(newValue, 12) }
//    }
// }

@propertyWrapper
struct SmallNumber {
    private var maximum: Int
    private var number: Int

    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, maximum) }
    }

    init() {
        maximum = 12
        number = 0
    }
    init(wrappedValue: Int) {
        maximum = 12
        number = min(wrappedValue, maximum)
    }
    init(wrappedValue: Int, maximum: Int) {
        self.maximum = maximum
        number = min(wrappedValue, maximum)
    }
}

struct ZeroRectangle {
    @SmallNumber var height: Int
    @SmallNumber var width: Int
}

var zeroRectangle = ZeroRectangle()
print(zeroRectangle.height, zeroRectangle.width)
// Prints "0 0"

 


그래서 본론으로 돌아와서, appstorage가 무엇인지 알아보겠습니다.

@AppStorage("KEY") var Name: Type = Value
// UserDefaults.standard.set("Value", forKey: "KEY")

swiftUI 버전의 UserDefaults 라고 생각을 하면 됩니다. 그렇기에 앱을 종료가 되더라도, 값이 저장이 되어 유지를 시킬 수 있게 됩니다.