iOS/Swift

프로퍼티 3편 (프로퍼티 감시자)

밤새는 탐험가89 2024. 1. 23. 12:24

 

 

프로퍼티 감시자 

프로퍼티의 값 변경에 따라 작업을 구현할 수 있음

 

프로퍼티에 새로운 값이 할당 또는 변경 또는 변경된 값이 현재와 차이가 없더라도 

호출되어 작업을 구현할 수 있음 

 

 

프로퍼티 감시자는 지연 저장 프로퍼티에는 사용 못함

일반 저장 프로퍼티에 사용

또는 프로퍼티 재정의해 상속받은 저장 프로퍼티, 연산 프로퍼티에 사용

 

 

 

프로퍼티 감시자 메서드 

프로퍼티의 값이 변경되기 직전에 호출하는 willSet

프로퍼티의 값이 변경된 직후에 호출하는 didSet 

 

프로퍼티 감시자

class FruitInfo {
    var name: String = "what?" {
        willSet {
            print("now fruit: \(name), after fruit: \(newValue)")
        }
        
        didSet {
            print("now fruit: \(name), before fruit: \(oldValue)")
        }
    }
}


var apple: FruitInfo = FruitInfo()
print(apple.name)
// what?

apple.name = "delmont apple"
// now fruit: what?, after fruit: delmont apple
// now fruit: delmont apple, before fruit: what?

 

 

willSet 메서드

값이 저장되기 "직전"에 새로운 값이 "파라미터"로 전달

이 때 파라미터 이름을 지정할 수 있음

 

willset(파라미터) 식으로 정할 수 있으나, 

이름을 따로 지정안한다면?

"newValue"로 사용 

class FruitInfo {
    var name: String = "what?" {
        willSet(newFruit) {
            print("now fruit: \(name), after fruit: \(newFruit)")
        }

 

참고로 willSet 메서드는 바뀌기 직전을 알려주는 것이기 때문에

아직 name 이라는 저장 프로퍼티의 값은 "what?" 임

 

 

didSet 메서드

값이 저장된 "직후"에 이전 프로퍼티의 값이 "파라미터"로 전달 

파라미터의 이름 역시 willSet 메서드에서 처럼 지정해줄 수 있으나 

이름을 따로 사용하지 않으면

"oldValue" 사용 

 

 

프로퍼티 감시자의 동작 순서를 다시 살펴 보면

willSet 실행 -> 저장 프로퍼티 name의 값 변경 -> didSet 실행 

 

 

 

 

연산 프로퍼티에서도 프로퍼티 감시자 사용 가능

(단, 부모 클래스의 연산 프로퍼티를 오버라이딩 = 재정의한 경우)

 

왜냐하면 연산 프로퍼티는 setter 부분을 통해 변경 여부 확인 가능하기 때문에 

굳이 프로퍼티 감시자를 사용할 필요 없음 

 

 

class FruitInfo {
    var name: String = "what?" 
    
    var title: String {
        get {
            return name 
        }
        
        set {
            name = newValue 
        }
    }
}


class Market: FruitInfo {
    override var title: String {
        willSet {
            print("now title: \(title), after title: \(newValue)")
        }
        
        didSet {
            print("now title: \(title), before title: \(oldValue)")
        }
    }
}

let jerryMarket: Market = .init()
jerryMarket.title = "jerry`s Market"

// now title: what?, after title: jerry`s Market
// now title: jerry`s Market, before title: what?

 

jerryMarket의 title 이라는 연산 프로퍼티에 새로운 값을 할당하면?

이를 프로퍼티 감시자가 값의 변경을 감지하여 내부 코드를 실행 

 

 

※ 프로퍼티 감시자는 데이터로부터 값을 전달받아 테이블을 구현할 떄 

테이블의 셀마다 이미지와 텍스트 등을 데이터로부터 받아 변경되는 값을 

프로퍼티 감시자를 통해 쉽게 코드를 구혀할 수 있음

 

 

 

'iOS > Swift' 카테고리의 다른 글

메서드  (0) 2024.01.26
프로퍼티 4편 (타입 프로퍼티)  (1) 2024.01.25
프로퍼티 2편 (연산 프로퍼티)  (0) 2024.01.22
프로퍼티 1편 (저장 프로퍼티)  (0) 2024.01.19
구조체와 클래스의 차이  (0) 2024.01.18