Danny의 iOS 컨닝페이퍼
article thumbnail

속성 감시자 (Observed Properties)

값이 변경될 때 관찰하고 이를 willSet, didSet으로 수행하게 됩니다.

 

순서는

  • willSet : 값이 저장되기 직전에 호출됩니다.
  • didSet : 새 값이 저장된 직후에 호출됩니다.

보통 Model의 변경사항을 View에 반영하고자 할 때 사용합니다.

 

선언

기본적으로 속성 감시자는 초기값이 필요합니다. 만약 초기값을 정해주지 않으면 생성자를 통해서 초기화해야 됩니다.

var observer: String = "속성감시자" {
    willSet {
        // 바뀔 값이 파라미터로 전달
        // 기본적으로 willSet(newValue)으로 구현이 되어있다.
    }
    didSet {
        // 바뀌기 전의 과거값이 파라미터로 전달
        // 기본적으로 didSet(oldValue)으로 구현이 되어있다.
    }
}

-------------------------------------------------------------------------------------------------

// 이와같이 직접 파라미터를 만들어서 사용도 가능하다
var observer: String = "속성감시자" {
    willSet(message) {
        print(message)
    }
    didSet(message) {
        print(message)
    }
}

observer의 값이 변할 때마다 willSet, didSet을 호출하여 수행을 시킵니다.

 

예시

코드로 예시를 보면서 속성감시자에 대하여 이해해 봅시다.

 

아래의 코드와 같이 12조각의 치킨이 있습니다. 여기서 willSet, didSet의 특징을 살펴봅시다.

var piecesOfChicken = 12 {
    willSet {
        print("기존의 치킨 개수 : \(piecesOfChicken)조각")
        print("현재의 치킨 개수 : \(newValue)조각")
    }
    didSet {
        print("기존의 치킨 개수 : \(oldValue)조각")
        print("현재의 치킨 개수 : \(piecesOfChicken)조각")
    }
}

// 만약 치킨이 8개로 변경이 된다면
piecesOfChicken = 8

// 기존의 치킨 개수 : 12조각
// 현재의 치킨 개수 : 8조각
// 기존의 치킨 개수 : 12조각
// 현재의 치킨 개수 : 8조각

기본값은 willSet(newValue), didSet(oldValue) 이와 같이 뒤의 파라미터로 선언이 되어있습니다.

input(newVlaue, oldVlue)을 위와 같이 사용할 수 있습니다.

 

값이 변경될 때

  • willSet (값이 저장되기 직전에 호출)
    • piecesOfChicken변경되기 이전 값을 받아옵니다. 
    • 변경된 값newValue로 받아와 사용합니다.
  • didSet (새 값이 저장된 직후에 호출)
    • piecesOfChicken변경된 값을 받아 옵니다.
    • 변경되기 이전 값oldValue로 받아와 사용합니다.

여기서 생각해보면 속성감시자를 사용할 때 왜 didSet을 더 많이 쓰는지 알 수 있습니다.


호출되는 순서도 분명히 상관이 있을 거예요. 저장된 직후 didSet이 호출이 되므로 변한 값을 사용할 수 있죠.

변수의 값을 변경시키면 보통 이전 값은 사용 안 하는 것도 이유가 될 것 같네요

 

응용을 해봅시다

Q: 기본 옵션은 10조각을 주문하는 겁니다.

Q: 치킨을 주문할 때 20조각 이상은 주문을 불가능하게 만들어 봅시다. 또한 초과 주문 시 최대 개수를 20조각으로 고정시켜 봅시다.

var piecesOfChicken = 10 {
    didSet {
        if piecesOfChicken > 20 {
            print("잘못된 주문 개수, 최대 20개까지 설정이 가능합니다.")
            piecesOfChicken = 20
        }
    }
}

// 30개를 주문 했을 때
piecesOfChicken = 30
print(piecesOfChicken)

// 잘못된 주문 개수, 최대 20개까지 설정이 가능합니다.
// 20

이걸 읽어보면 확실히 이해가 가실 거예요. 한번 풀이를 해보자면

처음 치킨 조각(piecesOfChicken)은 10개 입니다

값이 변했다면(didSet)

만약 치킨조각이 20개 이 초과될 때에는 "잘못된 주문 개수, 최대 20개까지 설정이 가능합니다."를 프린트 하고 

변한 치킨 조각 개수는 20로 만들어 주세요.

 

 

부족한 설명이지만, 조금은 이해 가셨나요?

틀린 내용이 있다면 언제든지 지적해 주시면 감사히 받겠습니다. 🫠
읽어주셔서 감사합니다 😃

 

반응형

'Xcode > Swift 문법' 카테고리의 다른 글

[iOS/Swift] 프로토콜 Equatable (타입 비교)  (0) 2023.01.12
[iOS/Swift] 속성(Properties)의 종류  (0) 2023.01.04
[iOS/Swift] Class와 Struct  (0) 2022.12.28
[iOS/Swift] 고차함수  (0) 2022.12.27
[iOS/Swift] inout 파라미터  (4) 2022.12.27
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!