swift는 다양한 프로퍼티를 제공한다. 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티... 이번엔 그 중 많이 사용하는 연산 프로퍼티와 프로퍼티 옵저버에 대해 정리해보려 한다.
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은 프로퍼티 값의 변경 직전과 직후를 감지하여 그 시점에 작업을 진행할 수 있게 해주는 굉장한 기능을 가졌다. 그래서 보통 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에 관한 갱신하는 작업을 따로 할 필요없다. 간단히 정리를 해보면