-
Property WrapperSwift 2021. 12. 13. 13:30
Swift5.1에서 추가된 기능
Swift UI 관련된 영상을 보면
@ObservedObject , @Binding, @State 이런 친구들이 있는데 ...! Property 앞에 선언해서 사용하는 형식이다.
아래 같은 느낌이다.
@ObservedObject var viewModel = ViewModel()
Propery Wrapper는 반복되는 로직을 프로퍼티에 연결할 수 있다.
@propertyWrapper
를 붙이고 wrappedValue 라는 반복되는 로직을 넣으면 된다.
내 예제는 Userdefaults에 Property Wrapper를 적용한것이다.
@propertyWrapper // 이런식으로 선언해주고 struct UserDefaultsWrapper<T> { let key: String let defaultValue: T let userDefaults: UserDefaults = .standard var wrappedValue: T { // 여기 반복되는 로직을 넣는다. get { return userDefaults.object(forKey: key) as? T ?? defaultValue } set { if let optional = newValue as? AnyOptional, optional.isNil { UserDefaults.standard.removeObject(forKey: key) } else { userDefaults.set(newValue, forKey: key) } } } } // 사용할때 @UserDefaultsWrapper(key: "key", defaultValue: nil)
위처럼 쉽게 custom 가능하다.
init을 포함하면
@propertyWrapper struct Test: Hashable { private var value: String = "" var wrappedValue: String { get { self.value } set { if newValue == ""{ self.value = "" } else { self.value = newValue // 대충 이런식으로 뭐든 custom 가능(공통로직) } } } init(wrappedValue initialValue: String) { self.wrappedValue = initialValue } }
didSet을 활용하는 방법
@propertyWrapper struct Test: Hashable { var wrappedValue: String { didSet { self.wrappedValue = wrappedValue // 어떤 로직 처리 } } init(wrappedValue initialValue: String) { self.wrappedValue = initialValue // didSet은 Init은 타지 않으니까, 여기에도 로직 처리 추가. } }
다양하게 활용 가능하니 꼭 알아두고 적용하자.
추가
아래에 다양하게 사용할 수 있는 방법이 나와있다. ex) 음수 양수가 아닌 정수임을 보장하는 @Positive / @NonNegative, 문자열 공백 처리, CaseInsensitive,
728x90'Swift' 카테고리의 다른 글
Feature flags in Swift (0) 2021.12.22 Swift nil, 왜 null이 아닐까? (0) 2021.12.19 swift Pecker란 (0) 2021.11.15 Xcode 빌드 속도 높이기2 - cocoapods-binary-cache (1) 2021.11.11 Swift Moya 설치 및 내용, RxMoya (0) 2021.10.13