Dev-iOS/SwiftUI

[SwiftUI] 프로퍼티 래퍼 (Property Wrapper)

lafortune 2024. 9. 9. 14:59
반응형

프로퍼티 래퍼란?

프로퍼티 래퍼는 Swift에서 특정한 방식으로 프로퍼티를 동작시키는 구조를 정의하는 기능입니다.
SwiftUI에서는 이 프로퍼티 래퍼를 통해 다양한 동작을 캡슐화하고 코드를 깔끔하게 유지하는데 도움이 됩니다. @State, @Binding, @ObservedObject, @EnvironmentObject 등이 대표적인 예입니다.

 

왜 프로퍼티 래퍼를 사용하는가?

프로퍼티 래퍼를 사용하면 복잡한 로직을 래퍼 내부에 숨기고, 코드의 가독성을 향상시키며, 일관된 방식으로 특정 기능을 제공할 수 있습니다. 

예를 들어, SwiftUI의 @State 프로퍼티 래퍼를 사용하면, UI의 상태를 안전하게 관리하고 UI가 상태의 변화를 자동으로 반영할 수 있게 만듭니다.

struct ContentView: View {
...
	@State var message: String = ""
    
   	var body: some View {
    	...
        Text(message)
        ...
    }
...
}

이렇게 하면 뷰의 상태를 쉽게 관리하고 코드를 간결하게 유지할 수 있습니다.

 

언제 프로퍼티 래퍼를 사용하는가?

SwiftUI에서 프로퍼티 래퍼는 주로 뷰의 상태 관리나 환경 설정에 사용됩니다.

자주 사용하는 몇가지 프로퍼티 래퍼에 대한 설명은 아래와 같습니다.

  • @State는 뷰의 상태를 관리하는데 사용됩니다.
  • @Binding은 부모와 자식 뷰 사이에서 상태를 공유하는데 쓰입니다.
  • @ObservedObject과 @Published는 객체의 변경을 감시하고 그 변화에 반응하는 데 사용됩니다.

이런 식으로 프로퍼티 래퍼를 사용하면 상태 변화를 안전하게 관리하고 코드를 간결하게 유지할 수 있습니다.

 


이미 정의된 프로퍼티 래퍼를 사용하는 것 외에도 직접 커스텀 프로퍼티 래퍼를 만들어 사용할 수 있습니다.

커스텀 프로퍼티 래퍼

SwiftUI에서 제공하는 프로퍼티 래퍼만으로도 상당히 많은 기능을 구현할 수 있지만, 때로는 프로젝트의 특정 요구사항을 만족시키기 위해 커스텀 프로퍼티 래퍼를 만들어야 할 때가 있습니다. 

그렇다면 커스텀 프로퍼티 래퍼를 만드는 이유는 무엇이며, 그 장점은 무엇일까요?

 

커스텀 프로퍼티 래퍼를 만드는 이유

커스텀 프로퍼티 래퍼를 만드는 주된 이유는 프로젝트의 특정 요구사항에 맞춰 프로퍼티의 동작을 정확히 제어하고 싶을 때입니다. 

 

예를 들어, 특정 값이 변경될 때마다 로그를 작성하거나, 프로퍼티의 값에 특정 변환을 적용하거나, 값의 유효성을 검사하는 등의 동작을 프로퍼티에 부여하고 싶을 때 커스텀 프로퍼티 래퍼를 사용할 수 있습니다.

 

커스텀 프로퍼티 래퍼의 장점

커스텀 프로퍼티 래퍼의 가장 큰 장점은 재사용성과 유지 관리의 용이성입니다.

 

커스텀 프로퍼티 래퍼를 사용하면 동일한 동작을 하는 프로퍼티를 여러 곳에서 재사용할 수 있습니다. 이를 통해 코드 중복을 줄이고 일관성을 유지할 수 있습니다. 그리고 커스텀 프로퍼티 래퍼의 로직을 한 곳에 모아놓으면 해당 로직을 관리하기가 더 쉽습니다. 만약 프로퍼티의 동작 방식을 변경해야 할 경우, 해당 프로퍼티 래퍼만 수정하면 모든 사용처에서 동일하게 적용됩니다.

 

커스텀 프로퍼티 래퍼 만들기

프로퍼티 래퍼를 만드는 방법은 @propertyWrapper 어노테이션을 사용하는 것입니다.

이 어노테이션을 사용하면 프로퍼티에 대한 접근 및 수정 방법을 사용자 정의할 수 있는 구조체나 클래스를 만들 수 있습니다.

@propertyWrapper
struct Capitalized {
    var value: String
    
    var wrappedValue: String {
        get { value }
        set { value = newValue.capitalized }
    }
    
    init(wrappedValue: String) {
        self.value = wrappedValue.capitalized
    }
}

struct User {
    @Capitalized var firstName: String
    @Capitalized var lastName: String
}

 

위 코드는 @Capitalized라는 프로퍼티 래퍼를 만듭니다.

커스텀 프로퍼티 래퍼를 작성할 때 wrappedValue는 반드시 포함되어야 합니다.

wrappedValue는 실제 프로퍼티의 값을 가지고 있거나 그 값을 어떻게 처리할지 정의하는 핵심적인 부분입니다.

이 변수가 프로퍼티 래퍼를 선언할 때 사용하는 실제 값을 대표하며, 이를 통해 프로퍼티 래퍼의 동작을 제어합니다.

 초기화 함수는 필수는 아닙니다. 그러나 프로퍼티 래퍼가 초기 상태를 가져야 하거나 특정 조건을 충족해야 하는 경우에는 초기화 함수를 제공하는 것이 좋습니다. 

 

@Capitalized 프로퍼티 래퍼는 프로퍼티에 대입된 문자열 값을 대문자로 변환하는 역할을 합니다.
User 구조체에서 @Capitalized를 사용하면, firstName과 lastName이 자동으로 대문자로 시작되는 것을 보장할 수 있습니다. 

이런 식으로 프로퍼티 래퍼를 사용하면 프로퍼티의 동작을 쉽게 제어하고 코드의 가독성을 향상시킬 수 있습니다.

 

 

반응형