[야우쓰] 4주차(4) 프로퍼티 옵저버

hello_hidi·2022년 12월 13일
0

야우쓰

목록 보기
20/20
post-thumbnail

Property Observer

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

쉽게 말해서
내가 관찰하는 프로퍼티에 값을 설정하려고 할때 변경을 감지한다.

willSet

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

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

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

name = "Hidi"
// 현재 이름 = Unknown, 바뀔 이름 = Hidi
// 값이 변경되기 "직전"에 호출되는 것이라
// 현재 이름(name)은 아직 이전 값인 Unknown임!!!!

didSet

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

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

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

name = "Hidi"
// 현재 이름 = Hidi, 바뀌기 전 이름 = Unknown
// 값이 변경된 "직후"에 호출되는 것이라
// 이전에 저장되어 있던 Unknown이 파라미터 oldValue로 넘어온 것

두개 같이 사용 가능?

A. 쌉가능
1. willSet이 먼저 실행
2. 저장 프로퍼티 name의 값 변경
3. didSet 실행

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

연산 프로퍼티 + 프로퍼티 옵저버 가능?

가능하다. but 부모클래스의 연산 프로퍼티를 오버라이딩 할 경우에만!
why? setter을 통해 값 변경 감지가 가능한데 굳이..?

class Human {
    var name = "Unknown"
    var alias: String {
        get {
            return name + " 바보"
        }
        set {
            name = newValue + "별명에서 붙여진 이름"
        }
        willSet { }       // error! 'willSet' cannot be provided together with a getter
        didSet  { }       // error! 'didSet' cannot be provided together with a getter
    }
}


class Hidi: Human {
    override var alias: String {
        willSet {
            print("현재 alias = \(alias), 바뀔 alias = \(newValue)")
        }
        didSet {
            print("현재 alias = \(alias), 바뀌기 전 alias = \(oldValue)")
        }
    }
}
profile
안뇽희디

0개의 댓글