프로퍼티 래퍼에 대해서 Araboza
프로퍼티 래퍼는 클래스(class)와 구조체(struct)의 구현부에 getter, setter, 연산 프로퍼티 코드의 중복을 줄이는 방법을 제공한다. (Swift 5.1부터 생김)
여러 클래스나 구조체에 생성한 연산 프로퍼티들이 유사한 패턴을 갖는 경우가 발생해서 불편할 때가 있다.
- 이 때, 프로퍼티 래퍼를 사용하면 연산 프로퍼티 기능을 개별 클래스, 구조체와 분리할 수 있고, 앱 코드에서 재사용할 수 있다.
예제
struct Address {
private var cityName: String
var city: String {
get { cityName }
set { cityName = newValue.uppercased()}
}
}
사용자가 도시 이름을 어떻게 입력했는지와는 상관 없이 대문자로 저장되어야 한다면 다음과 같이 연산 프로퍼티를 구조체에 추가할 수 있다.
도시 이름 프로퍼티에 할당되면 연산 프로퍼티의 setter가 private cityName 변수에 값을 저장하기 전에 대문자로 변환하게 된다.
var address = Address()
address.city = "Seoul"
print(address.city) // LONDON
@propertyWrapper // 이 지시자를 이용하여 선언
struct FixCase {
private(set) var value: String = ""
var wrappedValue: String {
get { value }
set { value = newValue.uppercased() }
}
init(wrappedValue initialValue: String) {
self.wrappedValue = initialValue
}
}
모든 프로퍼티 래퍼는 값을 변경하거나 유효성을 검사하는 getter, setter 코드가 포함된 wrappedValue 프로퍼티를 가져야 한다.
struct Contact {
@FixCase var name: String // FixCase동작이 필요한 프로퍼티 앞에 @FixCase를 붙인다.
@FixCase var city: String
@FixCase var country: String
}
var contact = Contact(name: "GilDong", city: "Seoul", country: "Korea")
print("\(contact.name), \(contact.city), \(contact.country)")
// GILDONG, SEOUL, KOREA