프로퍼티의 종류
프로퍼티는 구조체, 클래스, 열거형 내부에 구현할 수 있다. 다만 열거형 내부에는 연산 프로퍼티만 구현할 수 있다.
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
}
}
// ③ 읽기전용 인스턴스 연산 프로퍼티
// func selfIntroduce() {
// print("저는 \(self.class)반 \(self.name)입니다")
// }
// 위의 함수를 이렇게 바꿔줌
var selfIntroduction: String {
get {
return "저는 \(self.class)반 \(self.name)입니다"
}
}
// ④ 타입 저장 프로퍼티
static var typeDescription: String = "학생"
}
var me: Student = Student()
me.westernAge = 10
print("제 미국나이는 \(me.westernAge)살이고 한국나이는 \(me.koreanAge)살입니다.")
// 제 미국나이는 10살이고 한국나이는 11살입니다.
me.name = "야곰"
print(me.selfIntroduction)
// 저는 Swift반 야곰입니다.
② 연산 프로퍼티인 westernAge에 값을 세팅해주면 set 블록이 실행되어 koreanAge라는 프로퍼티의 값이 알아서 연산되어 할당된다. set 블록에 inputValue 처럼 들어올 값의 매개변수의 이름을 정해줄 수 있는데, 만약 지정하지 않는다면 암시적으로 newValue에 값이 할당된다. 반대로 westernAge에서 값을 꺼내갈 때는 get 블록이 실행되어 koreanAge로부터 또 연산을 해서 리턴한다.
③ 매개변수와 반환값이 없는 함수들은 읽기전용 연산 프로퍼티로 만들어줄 수 있다. 이렇게 연산 프로퍼티에 get만 구현이 되어 있으면 읽기전용! (쓰기전용은 없음)
저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역변수에도 모두 사용 가능하다.
var a: Int = 100
var b: Int = 20
var sum: Int = {
return a + b
}
print(sum) // 300
struct Money {
var currencyRate: Double = 1100 {
willSet(newRate) {
print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다.")
}
didSet(oldRate) {
print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다.")
}
}
}
var money = Money()
// 환율이 1100.0에서 1150.0로 변경될 예정입니다.
money.currencyRate = 1150
// 환율이 1100.0에서 1150.0로 변경되었습니다.
currencyRate 프로퍼티에 저장된 값이 변경될 때 willSet과 didSet이 호출된다.
프로퍼티 감시자의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역변수에도 모두 사용 가능하다.
var a: Int = 100 {
willSet {
print("\(a)에서 \(newValue)로 변경될 예정입니다.")
}
didSet {
print("\(oldValue)에서 \(a)로 변경되었습니다.")
}
}
// 100에서 200로 변경될 예정입니다.
a = 200
// 100에서 200로 변경되었습니다.
야곰의 스위프트 기본 문법 강좌를 수강하며 작성한 내용입니다.