Swift - 프로퍼티 옵저버

이원석·2024년 11월 12일

Swift

목록 보기
8/38

프로퍼티옵저버

프로퍼티 값의 변화를 관찰하는 것으로, 저장 프로퍼티에 추가할 수 있다.
새 값의 속성이 현재 값과 동일하더라도 속성 값이 설정되면 호출된다

willSet

willSet 옵저버를 구현하면, 값이 저장되기 직전에 새로 저장될 값이 파라미터로 전달 된다. 이때 파라미터 이름은 지정할 수 있지만, 파라미터 이름과 괄호를 따로 지정하지 않을 경우 newValue로 사용한다.

var name: String = "Unknown" {
	willSet(newName){
    	print("현재이름 = \(name), 바뀔이름 = \(newName)")
    }
}

var name: String = "Unknown" {
    willSet {
        print("현재 이름 = \(name), 바뀔 이름 = \(newValue)")
    }
}

didSet

didSet 옵저버를 구현하면, 값이 저장된 직후에 이전 프로퍼티의 값이 파라미터로 전달된다. 이때 파라미터 이름은 지정할 수 있지만, 파라미터 이름과 괄호를 따로 지정하지 않을 경우 oldValue로 사용한다

var name: String = "Unknown" {
   didSet(oldName) {
        print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldName)")
    }
}


var name: String = "Unknown" {
   didSet {
        print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldValue)")
    }
}

willSet & didSet

ex)


var name: String = "Unknown" {
    willSet {
        print("현재 이름 = \(name), 바뀔 이름 = \(newValue)")
    }
    didSet {
        print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldValue)")
    }
}

name = "abc"
  • willSet 실행 -> 저장프로퍼티 name 값 변경 -> didSet 실행 순서

연산 프로퍼티에 프로퍼티 옵저버 추가하기

부모 클래스의 연산 프로퍼티를 오버라이딩 할 경우 프로퍼티 옵저버를 추가할 수 있다.

class Human {
    var name = "Unknown"
    var alias: String {
        get {
            return name + "def"
        }
        set {
            name = newValue + "ghi"
        }
        willSet { }       //에러
        didSet  { }       //에러
    }
}

class People: Human {
    override var alias: String {
        willSet {//부모 클래스의 연산 프로퍼티를 오버라이딩 했으므로 옵저버 추가 가능
            print("현재 alias = \(alias), 바뀔 alias = \(newValue)")
        }
        didSet {//부모 클래스의 연산 프로퍼티를 오버라이딩 했으므로 옵저버 추가 가능
            print("현재 alias = \(alias), 바뀌기 전 alias = \(oldValue)")
        }
    }
}

참조
개발자 소들이

0개의 댓글