- Swift 5.1에서 추가된 기능이다.
프로퍼티가 저장되는 방식을 관리하는 코드
와프로퍼티를 정의하는 코드
사이에 분리 계층을 추가한다.- 중복되는 값을 하나로 정의할 수 있다.
- 프로퍼티 자체에 연결할 수 있어, 보일러 플레이트 코드와 코드의 재사용성을 높여준다.
- 구조체, 열거형 혹은 클래스를 사용해 구현을 한다.
- 해당 타입 앞에
@Property Wrapper
를 붙여 컴파일러에게 이 타입은 특별하다. 라고 알려준다.- 쉽게 말해 프로퍼티가 해야할 행동을 정의하는 타입 이다.
✅ 사용 예시
문자를 대문자로 변경하려면,
struct Name {
private var _firstName = ""
private var _lastName = ""
var firstName: String {
get { self._firstName.uppercased() }
set { self._firstName = newValue }
}
var lastName: String {
get { self._lastName.uppercased() }
set { self._lastName = newValue }
}
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
}
var users = Name(firstName: "Jee", lastName: "Hwang")
users.lastName = "Kim"
print(users.lastName) // print "KIM"
위와 같이 선언 후 출력하였다.
근데, propertyWrapper
를 적용해보면
// propertyWrapper로 행동를 정의
@propertyWrapper
struct Uppercased {
var wrappedValue: String {
didSet { wrappedValue = wrappedValue.uppercased() }
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue.uppercased()
}
}
// 사용할 구조체 선언
struct User {
@Uppercased var firstName: String
@Uppercased var lastName: String
}
var user = User(firstName: "Jee", lastName: "Hwang")
user.lastName = "Kim" // 값 변경
print(user.lastName) // print "KIM"
propertyWrapper
를 정의 후, 사용할 프로퍼티 앞에 propertyWrapper
를 적어주기만 하면 된다.
코드에 중복도 사라지고 간결해지며, 유지보수가 용이해지는 느낌이다!