[Swift] 프로퍼티 감시자 (Property Observer)

Kio·2022년 1월 17일
0

Swift

목록 보기
9/14

안녕하세요! Kio입니다 👻

willSet, didSet을 보신 적이 있으신가요?
이는 프로퍼티 감시자(Property Observer)
관련이 있는데 오늘은 이를 정리해보고자 합니다.

Let's get started 🥰




프로퍼티 감시자 (Property Oberver)


개념 (concept)

프로퍼티 감시자는 프로퍼티(속성) 값의 변화를 관찰하고 반응합니다.
새 값이 프로퍼티의 현재 값과 같더라도 프로퍼티 값이 설정될 때마다 프로퍼티 감시자가 호출됩니다.

지금은 이게 무슨 말인지 이해가 안되는 게 당연합니다...😱



선언 가능한 장소 (Where)

사용할 수 있는 곳은 아래와 같습니다.

  • 사용자가 정의한 저장 속성
  • 상속받은 저장 속성
  • 상속받은 계산 속성


선언 (Declaration)

프로퍼티 감시자는 아래처럼 선언하여 사용가능합니다.

struct Madonalds {
    var orderedBurgers: Int {
        willSet {
            // some code
        }
        didSet {
            // some code
        }
    }
}


선택지 (Options)

willSet

  • 값이 저장되기 전에 호출됩니다.

didSet

  • 새 값이 저장된 직후에 호출됩니다.


예시 (Discussion)

프로퍼티? 감시자?
프로퍼티 감시자? 말부터 어려운데요 😶‍🌫️
다음 예시를 통해 감을 보다 쉽게 잡으실 수 있을거에요 👻


class McDonalds {
    var orderedBurgers: Int = 0 
}

var hamburgerCounter = McDonalds()
hamburgerCounter.orderedBurgers = 10

print(hamburgerCounter.orderedBurgers) // 10

McDonalds 라는 Class 내부에서
저장 속성 으로 orderedBurgers 를 선언하였습니다.
var 로 설정한 저장 속성 이라면 위처럼 값을 변경할 수 있습니다.
그리고 print 를 사용하면 콘솔 내에서 값을 확인할 수 있습니다.

그러면 프로퍼티 감시자 를 사용하면 어떤 점이 달라질까요?
새로 주문한 햄버거의 숫자(newValue)
이전 주문한 햄버거의 숫자(oldValue)를 체크해볼게요!


ex) 주문한 햄버거 갯수 체크하기

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 사용하니 print 하지 않았는데도
변경 이후 값(newValue)변경 이전 값(oldValue)에 대해 알 수 있네요!

🚨
그 이유는 바로 프로퍼티 감시자 가 프로퍼티(속성) 값의 변화를 관찰하고 반응하기 때문입니다. 포스팅 가장 상단에 있던 개념 (concept) 을 다시 보시면 이제 무슨 말인지 이해가 가실거에요!



매개변수 (Parameters)

newValue - oldValue

class McDonalds {
    var orderedBurgers: Int = 0 {
        willSet(newValue) {
            print("배고파서 주문한 햄버거는 \(newValue)개")
        }
        didSet(oldValue) {
            print("이전 주문한 햄버거는 \(oldValue)개")
        }
    }
}

willSet 에서는 newValue
didSet 에서는 oldValue

위와 같이 선언한 게 보이시나요?!
선언한 매개변수명으로 내부에서 사용이 가능합니다.


newValue- oldValue

class McDonalds {
    var orderedBurgers: Int = 0 {
        willSet {
            print("배고파서 주문한 햄버거는 \(newValue)개")
        }
        didSet {
            print("이전 주문한 햄버거는 \(oldValue)개")
        }
    }
}

어라...? 👀
이건 willSetdidSet 옆에 아무것도 선언하지 않았는데
내부에서 newValueoldValue 를 사용하고 있네요🤔

애플에서 기본 매개변수로 지정해주고 있기 때문에
선언하지 않아도 위처럼 사용이 가능하답니다 :)


newBurgersNumber - oldBurgersNumber

class McDonalds {
    var orderedBurgers: Int = 0 {
        willSet(newBurgersNumber) {
            print("배고파서 주문한 햄버거는 \(newBurgersNumber)개")
        }
        didSet(oldBurgersNumber) {
            print("이전 주문한 햄버거는 \(oldBurgersNumber)개")
        }
    }
}

이렇게 매개변수를 원하는 이름으로 선언도
가능하다는 점까지 알아두시면 프로퍼티 감시자는 끝난 겁니다!

프로퍼티 감시자 넌 끝이다
하지만 언제나 끝나는 건 나였다 😱




참고

Properties - The Swift Programming Language




잘못된 정보가 있으면 언제든 코멘트 부탁드립니다 👻

profile
Someday_iOS_Dev

1개의 댓글