안녕하세요. AboutTech입니다. 이번 포스팅에서는 Swift 5.1 버전부터 적용되기 시작한 Property Wrapper에 대해 알아보고자 합니다. 이전에 OOP를 알아보면서 연산 프로퍼티 사용을 조금 더 간단하게 도와주는 개념입니다.
만약 클래스나 구조체 내부에 선언된 연산 프로퍼티의 로직을 다른 클래스나 구조체에서도 동일하게 사용하기 위해서는 어떻게 해야 될까요? 해당 로직을 복사해서 붙여 넣는 방식으로는 한계점에 직면하게 됩니다. 이 문제를 해결해주는 것이 바로 프로퍼티 래퍼입니다.
Property Wrapper 사용법
간단한 구조체를 선언했고, 인스턴스를 생성해서 name이라는 프로퍼티를 출력하고 있습니다. name 연산 프로퍼티는 구조체 내부의 value 값을 통해 새로운 값을 할당하고 있습니다. 만약 name의 연산 프로퍼티를 다른 구조체에서도 사용하기 위해서 복사하지 않고 사용하는 방법이 바로 Property Wrapper을 이용하는 것입니다.
struct Person {
var value: String = ""
var name: String {
get {
return value
}
set {
value = newValue.uppercased()
}
}
}
var person = Person()
person.name = "abouttech"
print(person.name)
위의 코드를 Property Wrapper를 이용해 리팩토링 하면 다음과 같습니다.
@propertyWrapper
struct Capitalize {
private(set) var value: String = ""
var wrappedValue: String {
get { return value }
set { value = newValue.uppercased() }
}
}
struct Person {
@Capitalize var name: String
}
var person = Person()
person.name = "abouttech"
print(person.name) // ABOUTTECH
모든 프로퍼티 래퍼는 게터와 세터를 포함하고 있는 'wrappedValue' 프로퍼티를 소유해야 합니다. 또한 @PropertyWrapper 지시자를 사용합니다. 이후 사용하고자 하는 클래스나 구조체에 선언된 프로퍼티 래퍼 지시자(@Capitalize)를 붙여주면 연산 프로퍼티를 구현한 것과 같은 로직을 수행할 수 있게 됩니다.
- wrappedValue 포함하기
- @PropertyWrapper 지시자 포함하기
- PropertyWrapper 이름 지시자 포함하기
위와 같은 방식으로 추가적인 파라미터를 전달받는 프로퍼티 래퍼 또한 구현할 수 있습니다. 파라미터를 전달 받기 위해 초기화 함수 init을 사용해서 프로퍼티 멤버들을 초기화해줍니다. 그리고 wrappedValue 프로퍼티는 setter에서 각 파라미터를 사용해서 값을 설정하게 됩니다.
@propertyWrapper
struct Multiplier {
private var value: Int
private let factor1: Int
private let factor2: Int
init(wrappedValue: Int = 0, factor1: Int, factor2: Int) {
self.value = wrappedValue
self.factor1 = factor1
self.factor2 = factor2
}
var wrappedValue: Int {
get { return value }
set { value = newValue * factor1 * factor2 }
}
}
property wrapper을 사용할 때도 파라미터를 전달해줄 수 있습니다. 이제 setter를 통해 파라미터 값을 토대로 Multiplier의 value를 setting 한 후 출력하면 결과를 얻을 수 있게 됩니다.
struct Number {
@Multiplier(factor1: 10, factor2: 20) var multipledValue: Int
}
var myNumber = Number()
myNumber.multipledValue = 100
print(myNumber.multipledValue) // 20000
이렇게 필요한 연산 프로퍼티를 한번 선언해 놓으면 코드 곳곳에서 바로 가져다 사용할 수 있기 때문에 사용성이 높습니다.
🚀️ 도움이 되셨다면 구독과 좋아요 부탁드립니다 👍️
'Programming > Swift' 카테고리의 다른 글
[iOS Swift] SwiftUI란? UIkit vs SwiftUI 비교 (0) | 2024.01.16 |
---|---|
[iOS Swift] 스위프트에서 Error Handling 하는 방법 (0) | 2024.01.15 |
[iOS Swift5] Collection, 배열과 딕셔너리, Set 기본 (2) | 2024.01.11 |
[iOS Swift5] 열거형 구조체 기본 기초 (0) | 2024.01.10 |
[iOS Swift5] 객체지향 프로그래밍 기초 클래스 프로토콜 익스텐션 (0) | 2024.01.09 |
댓글