Open Do-hyun-Kim opened 1 year ago
구조채에 대문자로 바꾸는 연산 프로퍼티를 구현하여 사용
struct Address {
private var cityname = ""
var city: String {
get { cityname }
set { cityname = newValue.uppercased() }
}
}
var address = Address() address.city = "Lodon" print( address.city ) // LODON
- 연산프로퍼티 대신 프로퍼티 래퍼로 구현하여 사용
```swift
@propertyWrapper
struct FixCase {
private(set) var value: String = ""
var wrappedValue: String {
get { value }
set { value = newValue.uppercased() }
}
init(wrappedValue initiaValue: String) {
self.wrappedValue = initiaValue
}
}
struct Contact {
@FixCase var name: String
@FixCase var city: String
}
var contract = Contact(name: "Hwnag", city: "Seoul")
print(contract.name, contract.city)// HWNAG SEOUL
-> 모든 프로퍼티 래퍼는 값을 변경하거나 유효성을 검사하는 getter 와 setter 코드가 포함된 wrappedValue 프로퍼티를 가져야 함
property wrapper는 프로퍼티를 저장/반환하는 로직에 대해 공통성을 높여주고 반복성을 줄여주는 wrapper를 말한다.
wrappedValue
를 정의하여 반복되는 저장/반환 로직을 작성한다.@propertyWrapper
struct Uppercase {
private var value: String = ""
var wrappedValue: String {
get { self.value }
set { self.value = newValue.uppercased() }
}
init(wrappedValue initialValue: String) {
self.wrappedValue = initialValue
}
}
property wrapper에 대해서 설명하시오.
Property wrapper란?
property Wrapper
는 Swift 5.1에서 추가된 기능이며 프로퍼티가 저장되는 코드와 프로퍼티가 정의되는 코드를 분리하는 계층을 추가한다.property Wrapper
를 통해 중복되는computed properties
로직을property Wrapper
를 사용함으로써 코드의 재사용성, 가독성을 높여줄 수 있다.property Wrapper
는struct
,class
enum
와 같이instance properties
를 정의할 수 있는 타입에 사용할 수 있다.Property Wrapper 사용법
@propertyWrapper
라는 키워드를struct
,class
,enum
타입에 정의하여 저장할 변수와wrappedValue
을 필수적으로 구현한다.wrappedValue
는Computed Property
형식으로 기능을 구현하여propertyWrapper
사용할 로직을 내부에 구현하여 중복을 방지한다.init(wrappedValue initialValue)
의 이니셜 라이져를 넣어 주지 않아도 실행은 되지만 이니셜 라이저를 넣어주지 않을 경우property wrapper
를 사용되는 부분에서 초깃값을 지정 시에`Error: Argument passed to call that takes no arguments
가 발생한다.propertyWrapper
내에서 privateinstacne Property
를 사용하고 싶지 않다면property observer
에didSet
을 사용하면 된다. 단didSet
은 초기화 시에 호출되지 않기 때문에 init 내부에 별도 로직을 추가해야 한다.Property Wrapper 언제 사용하면 좋을까?
computed Property
중에 중복되는 로직이 있을 경우property Wrapper
를 사용하는 것이 좋을 것 같습니다.UserDefaults
의property Wrapper
를 사용하여 defaultValue의 Type을 제너릭으로 받아 처리할 때에도 가독성을 높일 수 있을 것 같습니다.📝 참고 사이트