본문 바로가기
Programming/Swift

[iOS Swift5] 프로퍼티 래퍼 Property Wrapper?

by 개발자 염상진 2024. 1. 13.

안녕하세요. 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

 

이렇게 필요한 연산 프로퍼티를 한번 선언해 놓으면 코드 곳곳에서 바로 가져다 사용할 수 있기 때문에 사용성이 높습니다. 

 

🚀️ 도움이 되셨다면 구독좋아요 부탁드립니다 👍️

 

 

 

[iOS Swift5] 객체지향 프로그래밍 기초 클래스 프로토콜 익스텐션

Swift는 객체 지향 프로그래밍 언어(Object Oriented Programming)입니다. 그만큼 객체를 사용한 프로그래밍을 지원하고 있다는 말인데요, 객체는 재사용가능한 독립 기능 모듈로 클래스 구조체의 형태로

about-tech.tistory.com

 

 

[iOS Swift5] 함수, 메서드 그리고 클로져 기본 개념

프로그래밍 영역에서 함수는 반복적인 작업을 대폭 줄여주는 장점이 있습니다. 애플의 스위프트 언어 또한 함수를 제공하고 있는데요, 이번 포스팅에서는 Swift의 함수에 대해 알아보도록 하겠

about-tech.tistory.com

 

 

[iOS Swift5] if else, guard 제어 흐름 관리하기

Swift5 제어흐름 관리하기 안녕하세요 About Tech 입니다. 이번 포스팅에서는 Swfit 언어에서 제어흐름을 어떻게 관리할 수 있는지 알아보고자 합니다. 제어흐름은 조건식이라고도 불리는 if 문이나 gu

about-tech.tistory.com

 

댓글