프로퍼티에는 저장, 연산, 인스턴스, 타입이 있음.
프로퍼티는 구조체, 클래스, 열거형 내에서 구현 가능.
연산 프로퍼티는 var로만 설정 가능.
/* 프로퍼티 */
//클래스를 예로 프로퍼티를 설정해봄.
class Person {
//저장 프로퍼티: 흔히 아는 변수 선언 방법.
var name:String = ""
//미리 자원을 소비하여 계산할 필요가 없을 때는 lazy사용.
//구조체에서는 이 저장프로퍼티를 연산프로퍼티에서 get 할 때는 mutating해줘야 함.
lazy var westernAge:Int = 0
//연산 프로퍼티: get과 set을 사용
var koreanAge:Int {
get {
return westernAge + 1
}
set(inputValue) {
westernAge = inputValue - 1
}}
//읽기전용 인스턴스 연산 프로퍼티
var greeting:String {
get {
return "Hello, my name is \(self.name)"
}}
//타입 프로퍼티: 구조체나 클래스 전체를 메모리에 할당하지 않고 사용할 때
//타입 프로퍼티는 특정 타입에 속한 프로퍼티로, 그 타입에 단 하나의 프로퍼티만 생성됨.
//인스턴스와는 다르게 타입은 항상 초기값을 지정(이니셜라이저가 없기 때문)
static var msg:Int { return 5 }
//class로 선언되는 타입프로퍼티는 클래스에서만 사용가능하고, 오버라이딩이 가능함.
class var overidableMsg:Int { return 6 }
//프로퍼티 감시자(옵저버)
//프로퍼티에 새 값이 설정(set)될 때마다 이벤트를 감지하는 기능.
//새 값이 이전값과 같은 값이라도 호출됨.
//lazy에서는 사용될 수 없음.
//willSet(값 바뀌기 전), didSet(값 바뀐 후)
//willSet에서 파라메터 지정 가능. (기본:newValue)
//didSet역시 파라메터 가짐. (기본:oldValue)
var score:Int = 0 {
willSet(newScore) {
print("Score Changing: \(score) to \(newScore)")
}
didSet {
if(score > oldValue) {
print("Upgrade your Score: \(score - oldValue)")
}
}
}
}
//프로퍼티의 사용
var james:Person = Person() //프로퍼티가 저장된 구조체 생성
james.name = "James"
james.westernAge = 32
print(james.greeting)
print("My Korean Age is \(james.koreanAge)")
print(Person.msg) //타입 프로퍼티는 인스턴스 생성 없이 바로 구조체/클래스명으로 접근
james.score = 65
james.score = 77