[iOS] get, set, didSet, willSet

ungchun·2022년 7월 8일
0
post-thumbnail

swift는 다양한 프로퍼티를 제공한다. 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티... 이번엔 그 중 많이 사용하는 연산 프로퍼티와 프로퍼티 옵저버에 대해 정리해보려 한다.

get, set

get, set 이라고 하면 흔히 생각이 들고 자주 봤었던 getter, setter 라고 생각할 수 있다. 정답이다. 사용하는 방법과 이유가 거의 유사하다. swift에서는 get, set을 묶어 연산 프로퍼티라고 부른다. 사용법을 간단히 먼저 알아보자.

class Demo {
	// get, set을 사용하기 위해서는 그 연산된 값을 저장할 변수가 반드시 있어야한다.
    var _value : Int = 1 
    
    // value의 역할은 _value에 대해서 값을 연산하여 value에 할당하거나 리턴하는 역할만 한다.
    var value: Int { 
        get {
            return _value
        }
        set(newValue) {
            _value = newValue * 2
        }
    }
}

코드를 보면 따로 get, set 에 사용하는 값을 _value 라는 따로 변수를 만들었다. 만약 get, set 에 따로 변수를 만들어서 사용하지 않고 value 로 접근하면 xcode 에서 경고창을 띄운다. 그래서 우리는 사용할 때 따로 변수를 하나 만들어서 사용하도록 하자.


didSet, willSet

사실 이번 글을 쓰는 목적이자 개인적으로 신기했던 친구이다. didSet과 willSet은 프로퍼티 값의 변경 직전과 직후를 감지하여 그 시점에 작업을 진행할 수 있게 해주는 굉장한 기능을 가졌다. 그래서 보통 model에서의 변경사항을 view에 반영해야하는 일이 있으면 자주 쓰인다. 예를 들어 어떤 모델에 대한 값을 변경하고 그 값을 label에 세팅해주는 과정을 거친다고 생각해보자.

var tempValue = "값 변경 전"

tempValue = "값 변경 후"
label.text = tempValue

이렇게 진행해도 아무 문제는 없다. 하지만 이런 과정들이 하나 둘 늘어나면 코드도 길어지고 복잡해지는건 분명하다.

var tempValue: String = "값 변경 전" {
    willSet (newValue) {
        print("willSet, \(tempValue) -> \(newValue) , 변경 예정")
    }
    
    didSet (oldValue) {
        print("didSet, \(oldValue) -> \(tempValue) , 변경 완료")

		// view 갱신에 관한 코드를 willSet, didSet 본인이 필요한 곳에 넣어주면 된다.
        label.text = tempValue
    }
}

tempValue = "값 변경 후"

// willSet, 값 변경 전 -> 값 변경 후 , 변경 예정
// didSet, 값 변경 전 -> 값 변경 후 , 변경 완료

이렇게 작성하면 didSet과 willSet을 이용하면 값이 변경하는 그 순간을 감지하기때문에 View에 관한 갱신하는 작업을 따로 할 필요없다. 간단히 정리를 해보면

willSet: 프로퍼티의 값이 변경되기 직전에 호출되는 옵저버

  • 프로퍼티 값이 변경되기 전에 처리해야하는 일이 있으면 willSet을 이용해서 처리하면 된다.

didSet: 프로퍼티의 값이 변경된 직후에 호출되는 옵저버

  • 프로퍼티 값이 변경된 후에 처리해야할 일이 있으면 didSet을 이용해서 처리하면 된다.

0개의 댓글