Swift: Property / 프로퍼티 / Property Observer / 프로퍼티 감시자

Wooyo·2023년 10월 19일
0
post-thumbnail

1. 프로퍼티

  • 클래스 / 구조체 / 열거형과 연관된 값
  • 타입과 관련된 값을 저장 / 연산가능
  • 열거형 내부에는 연산 프로퍼티만 구현 가능
  • 연산 프로퍼티는 var 로만 선언
  • 연산 프로퍼티는 읽기전용으로는 구현 가능 / 쓰기 전용으로는 구현 할 수 없음
  • 읽기전용으로 구현하려면 get 블럭만 작성하면 가능
  • 읽기전용은 get블럭 생략 가능
  • 읽기 / 쓰기 모두 가능하게 하려면 get / set 블럭을 보두 구현
  • set 블럭에서 암시적 매개변수 newValue 사용가능

2. 프로퍼티 종류

  • 인스턴스 저장
  • 타입 저장
  • 인스턴스 연산
  • 타입 연산
  • 지연 저장

3. 사용예

struct Student {
	// 인스턴스 저장 프로퍼티
    var name: String = ""
    var `class`: String = "Swift"
    var koreanAge: Int = 0
    // 인스턴스 연산 프로퍼티
    var westernAge: Int {
    	get{
        	return koreanAge - 1
        }
        set(inputValue) {
        	koreanAge = inputValue + 1
        }
    }
    // 타입 저장 프로퍼티
    static var typeDescription: String = "학생"
    
    // 인스턴스 메서드
   	func selfIntro () {
    	print("i am \(name)")
    }
    
    // 읽기전용 인스턴스 연산 프로퍼티
    // 위의 메서드 대체 가능
    var readOnlySelfIntro: String {
    	get{
        	return "i am \(name)"
        }
    }
    
    // 타입 메서드
    static func typeSelfIntro () {
    	print("student")
    }
    
    // 읽기전용 타입 연산 프로퍼티
    // 읽기전용은 get 생략가능
    static var readOnlySelfInfro: String {
    	return "student type"
    }
}


// 타입 연산 프로퍼티 사용
print(Student.readOnlySelfIntro) // student type

// 인스턴스 생성

var me: Student = Student()
me.koreanAge = 10

// 인스턴스 저장 프로퍼티 사용
me.name = "me"

print(me.name) // me

// 인스턴스 연산 프로퍼티 사용
print(me.readOnlySelfInrto) // i am me

4. 응용

struct Money {
    var currencyRate: Double = 1100
    var dollar: Double = 0
    var won: Double {
        get {
            return dollar * currencyRate
        }
        set {
            dollar = newValue / currencyRate
        }
    }
}
var moneyInMyPocket = Money()
moneyInMyPocket.won = 11000
print(moneyInMyPocket.won) // 11000.0
moneyInMyPocket.dollar = 10
print(moneyInMyPocket.won) // 11000.0

5. 프로퍼티 감시자

  • 프로퍼티 감시자를 사용하면 값이 변결될 때 원하는 동작 수행가능
  • 값 변경직전 willSet 블럭 호출
  • 값 변경직후 didSet 블럭 호출
  • 둘 중 하나만 구현해도 무관
  • 변경값이 같더라도 항상 동작
  • willSet : 암시적 매개변수 newValue 사용가능
  • didSet : 암시적 매개변수 oldValue 사용가능
  • 연산 프로퍼티에는 사용불가
struct Money {
	// 프로퍼티 감시자 사용
    var currencyRate: Double = 1100 {
        willSet(newRate) {
        	print("rate to \(newRate)")
        }
        didSet(oldRate) {
       		print("rate from \(oldRate) to \(currencyRate)")
        }
    }
    
    var dollar: Double = 0 {
    	// 암시적 매개변수 이름 사용
        willSet {
        	print("dollar to \(new)")
        }
        // 암시적 매개변수 이름 사용
        didSet {
        	print("dollar from \(oldDollar) to \(dollar)")
        }
    }
    
    // 연산 프로퍼티
    var won: Double {
    	get {
        	return dollar * currenctRate
        }
        set {
        	dollar = newValue / currencyRate
        }
    }
}

var money: Money = Money()

// rate to 1000.0
money.currencyRate = 1000
// rate from 1100.0 to 1000.0

// dollar to 10.0
money.dollar = 10
// dollar from 0.0 to 10.0

print(money.won) // 100000.0
profile
Wooyo의 개발 블로그

0개의 댓글