본문 바로가기

Tech/iOS

[iOS] Day 24 - Property Observer

728x90

과제가 머리속에 멤돈다

답을 줄 듯 말 듯하다 

iOS 입덕부정기인건가...


Property Observer

스타크래프트 정찰병 observer를 생각해보자

 

저장 프로퍼티에서 사용되고 프로퍼티 값을 관찰(->observer)하다가 변경되었을 때 호출된다

 

get set 이 아닌 willSet, didSet 사용

willSet -> 값이 바뀌기 전에 사용

didSet -> 값이 바뀐 후 사용

 

struct BMI {
    
    var nickname: String {
        willSet(newNickaname) {
            print("유저 닉네임이 \(nickname)에서 \(newNickaname)로 변경될 예정")
        }
        didSet {
            print("유저 닉네입이 \(oldValue)에서 \(nickname)으로 변경 되었다")
        }
    }

default parameter newValue oldValue 사용 가능하다 

인스턴스 생성시 초기화를 해야하는 상황이기 때문에 oldValue 쓸 수 있다 값이 이미 들어와 있는 상태

이니셜라이저로 초기화가 되는 속성에서는 값을 안줘도 된다


Struct 내에서 Property 변경하려면 mutating 키워드를 사용 해야한다

struct class 의 Property 값은 instance method 로 값 변경이 불가능하다

truct Coffee {
    static var name = "아메리카노" // 타입 프로퍼티 인스턴스 내부에서 값 변경 불가
    static var shot = 2
    var price = 4900 // 인스턴스 프로퍼티로 값 변경 가능하다
    
    mutating func plusShot() {
        //Coffee.shot += 1  //명확하게 타입프로퍼티를 명시해줘야함
        price += 300 
    }
    //타입 메서드를 오버라이드해서 쓰고 싶다 minusShot -> 타입 function
    //구조체는 상속이 안됨 재정의 자체가 안됨 class func는 오버라이드를 위한 함수여서
    static func minusShot() {
        shot -= 1
    }
}

다시 말해서 내가 쓰는 인스턴스가 타입프로퍼티인지 인스턴스프로퍼티인지 확인 후 구조체 안에서 프로퍼티 값을 못 바꾼다

-> 바꾸고 싶다면 mutating 키워드를 붙여 주어야 함

-> class 사용 불가 상속이 불가능하기 때문에 struct 내에는 class 통해서 재정의 불가능


Class 내에서  타입 매서드 재정의 하고 싶다면 class로 재정의 해야한다 

class Lattee: Coffee {

   override class func minusShot() { //슈퍼클래스의 타입 메서들를 재정의해서 쓰고 싶다면 class!
   }

 

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

[iOS] Day 25 - Protocol  (0) 2022.07.28
[iOS] Day 25 - UIPickerView & WebView  (0) 2022.07.28
[iOS] Day 23 - Computed Property  (0) 2022.07.26
[iOS] Day 22 - Xcode Tip, bundle File 생성 방법  (0) 2022.07.25
[iOS] Day 19 - 첫 화면 구현  (0) 2022.07.22