안녕하세요!
Kio
입니다 👻
willSet
,didSet
을 보신 적이 있으신가요?
이는프로퍼티 감시자(Property Observer)
와
관련이 있는데 오늘은 이를 정리해보고자 합니다.
Let's get started 🥰
프로퍼티 감시자는 프로퍼티(속성) 값의 변화를 관찰하고 반응합니다.
새 값이 프로퍼티의 현재 값과 같더라도 프로퍼티 값이 설정될 때마다 프로퍼티 감시자가 호출됩니다.
지금은 이게 무슨 말인지 이해가 안되는 게 당연합니다...😱
사용할 수 있는 곳은 아래와 같습니다.
- 사용자가 정의한 저장 속성
- 상속받은 저장 속성
- 상속받은 계산 속성
프로퍼티 감시자는 아래처럼 선언하여 사용가능합니다.
struct Madonalds {
var orderedBurgers: Int {
willSet {
// some code
}
didSet {
// some code
}
}
}
willSet
- 값이 저장되기 전에 호출됩니다.
didSet
- 새 값이 저장된 직후에 호출됩니다.
프로퍼티? 감시자?
프로퍼티 감시자? 말부터 어려운데요 😶🌫️
다음 예시를 통해 감을 보다 쉽게 잡으실 수 있을거에요 👻
class McDonalds {
var orderedBurgers: Int = 0
}
var hamburgerCounter = McDonalds()
hamburgerCounter.orderedBurgers = 10
print(hamburgerCounter.orderedBurgers) // 10
McDonalds
라는Class
내부에서
저장 속성
으로orderedBurgers
를 선언하였습니다.
var
로 설정한저장 속성
이라면 위처럼 값을 변경할 수 있습니다.
그리고
그러면프로퍼티 감시자
를 사용하면 어떤 점이 달라질까요?
새로 주문한 햄버거의 숫자(newValue)
와
이전 주문한 햄버거의 숫자(oldValue)
를 체크해볼게요!
class McDonalds {
var orderedBurgers: Int = 0 {
willSet(newValue) {
print("배고파서 주문한 햄버거는 \(newValue)개")
}
didSet(oldValue) {
print("이전 주문한 햄버거는 \(oldValue)개")
}
}
}
var hamburgerCounter = McDonalds()
hamburgerCounter.orderedBurgers = 10
// 배고파서 주문한 햄버거는 10개 - newValue
// 이전 주문한 햄버거는 0개 - oldValue
hamburgerCounter.orderedBurgers = 20
// 배고파서 주문한 햄버거는 20개 - newValue
// 이전 주문한 햄버거는 10개 - oldValue
차이점이 보이시나요?!
willSet
,didSet
사용하니
변경 이후 값(newValue)
과변경 이전 값(oldValue)
에 대해 알 수 있네요!
🚨
그 이유는 바로프로퍼티 감시자
가 프로퍼티(속성) 값의 변화를 관찰하고 반응하기 때문입니다. 포스팅 가장 상단에 있던개념 (concept)
을 다시 보시면 이제 무슨 말인지 이해가 가실거에요!
class McDonalds {
var orderedBurgers: Int = 0 {
willSet(newValue) {
print("배고파서 주문한 햄버거는 \(newValue)개")
}
didSet(oldValue) {
print("이전 주문한 햄버거는 \(oldValue)개")
}
}
}
willSet
에서는newValue
didSet
에서는oldValue
위와 같이 선언한 게 보이시나요?!
선언한 매개변수명으로 내부에서 사용이 가능합니다.
class McDonalds {
var orderedBurgers: Int = 0 {
willSet {
print("배고파서 주문한 햄버거는 \(newValue)개")
}
didSet {
print("이전 주문한 햄버거는 \(oldValue)개")
}
}
}
어라...? 👀
이건willSet
과didSet
옆에 아무것도 선언하지 않았는데
내부에서newValue
와oldValue
를 사용하고 있네요🤔
애플에서 기본 매개변수로 지정해주고 있기 때문에
선언하지 않아도 위처럼 사용이 가능하답니다 :)
class McDonalds {
var orderedBurgers: Int = 0 {
willSet(newBurgersNumber) {
print("배고파서 주문한 햄버거는 \(newBurgersNumber)개")
}
didSet(oldBurgersNumber) {
print("이전 주문한 햄버거는 \(oldBurgersNumber)개")
}
}
}
이렇게 매개변수를 원하는 이름으로 선언도
가능하다는 점까지 알아두시면 프로퍼티 감시자는 끝난 겁니다!
프로퍼티 감시자 넌 끝이다
하지만 언제나 끝나는 건 나였다 😱
Properties - The Swift Programming Language
잘못된 정보가 있으면 언제든 코멘트 부탁드립니다 👻