본문 바로가기

Swift

[Swift] @propertyWrapper ?

안녕하세요 태태입니다. 💜 

오늘은 property Wrapper에 대해서 알아보는 시간을 갖도록 하겠습니다.

 

코드를 작성하면서 중복되는 코드를 줄이는 작업을 많이 하곤 하죠.

가장 간단한 방법으로는 중복되는 코드를 메서드로 정의하고 사용하는 방법이 있습니다.

 

 메서드 단위로 해결하면 클래스 혹은 구조체 내에서 접근을 해야하는데…
프로퍼티 단위로 중복이 발생하면, 이런 로직은 공통화할 수 없을까?

 

 

할 수 있습니다. 바로 PropertyWrapper를 사용하는 것 입니다.

struct ImageInfo {
    private var _image: String = ""
    
    var image: String {
    	get { self._image + ".jpg" }
        set { self._image = newValue }
    }
    
    init(image: String?) {
    	guard let image = image else {
        self._image = "Default Image"
        return 
        }
        self._image = image
    }
}

 

 

struct Post {
	private var postID: UUID = UUID()
    private var contents: String = ""
    private var _image: String = ""
    
    var image: String {
    	get { self._image + ".jpg" }
        set { self._image = newValue }
    }
    
    init(contents: String, image: String?) {
    	guard let image = image else {
        self._image = "Default Image"
        return 
        }
        self.contents = contents
        self._image = image
    }
}

 

위 코드를 보시면 같은 로직이지만 중복해서 작성을 해야합니다.

만약 jpg가 아닌 png 확장자로 변경해야한다면, 일일이 로직을 찾아 변경해야 하겠죠.

 

이런 중복을 줄일 수 있는 문법이 바로 @propertyWrapper 입니다.

@propertyWrapper
struct ImageString {
    private var _image: String = ""
    
    var wrappedValue: String {
    	get { self._image + ".jpg" }
        set { self._image = newValue }
    }
    
    init(wrappedValue initialValue: String) {
        self._image = initialValue
    }
}

 

위 코드처럼 정의해두면 _image 프로퍼티 부분을 @ImageString 어노테이션을 붙여 사용할 수 있습니다.

struct Post {
    private var postID: UUID = UUID()
    private var contents: String = ""
    @ImageString var image: String = ""
    
    init(contents: String, image: String) {
        self.contents = contents
        self.image = image
    }
}

let post = Post(contents: "dd", image: "post")
print(post.image)  // post.jpg

 

이렇게 오늘은 @propertyWrapper에 대해서 알아보았습니다 !

'Swift' 카테고리의 다른 글

[Swift] Lazy 키워드  (0) 2022.12.09
[Swift] UISwitch 크기 변경하기  (0) 2022.02.16