클래스, 구조체 또는 열거형 등에 관련된 값 -> 인스턴스의 값
클래스나 구조체에 저장된 값
/ in struct...
struct Pig {
var name: String
let gender:String
}
var pig = Pig(name: "꿀꿀이", gender: "수컷")
pig.name = "멧돼지"
// pig.gender = "암컷" // Error : gender가 상수로 선언
// 인스턴스 자체를 상수로 선언했을 때,
let pig2 = Pig(name: "왕돼지", gender: "수컷")
//pig.name = "작은돼지" // Error : 프로퍼티도 모두 상수로 되어서 에러 발생, 구조체는 value 타입이기 때문!
// in Class
class Cow {
var name:String
let gender:String
init(name:String, gender: String) {
self.name = name
self.gender = gender
}
}
let cow = Cow(name: "물소", gender : "수컷")
cow.name = "황소"
print(cow.name) // "황소" 에러가 나지 않는 이유 : Class는 참조 타입라서 가능하다.
값을 직접적으로 저장하는 대신에, getter와 setter를 사용해서 다른 프로퍼티에 접근 가능
struct Stock {
var averagePrice: Int
var quantity: Int
var purchasePrice : Int {
get {
return averagePrice * quantity
}
set(newPrice) {
averagePrice = newPrice / quantity
}
}
}
var stock = Stock(averagePrice: 2300, quantity : 3)
stock.purchasePrice // 6900, 연산 프로퍼티에 접근하면 get 블록 안의 코드가 실행된다.
stock.purchasePrice = 3000
stock.averagePrice // 1000, 연산 프로퍼티의 값이 바뀌면 set 블록 안의 코드가 실행된다.
class Account {
var credit : Int = 0 {
// 소괄호로 이름 지정 가능 (default : newValue / oldValue)
willSet {
print("변경 예정 : \(newValue)")
}
didSet {
print("변경 전 : \(oldValue)")
}
}
}
// willSet - 값이 저장되기 직전에 불리는 옵저버
// didSet - 값이 저장된 직후에 불리는 옵저버
var account = Account()
account.credit = 1000 // 변경 예정 : 1000 , 변경 전 : 0
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty : Int {
return 1
}
}
SomeStructure.computedTypeProperty // 1
SomeStructure.storedTypeProperty // Some value.
SomeStructure.storedTypeProperty = "Daeseong"
SomeStructure.storedTypeProperty // Daeseong
변수에 클래스나 구조체를 할당해 인스턴스 없이도 값에 접근이 가능하다.