var firstValue: Int
let length: Int
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// this range represents integer values 0, 1, 2, and 3
rangeOfFourItems.firstValue = 6
// this will report an error, even though firstValue is a variable property
> firstValue는 let이기 때문에 변경 불가능
- 처음 사용될 때까지 초기값은 계산되지 않는 프로퍼티 입니다. 지연 저장된 프로퍼티는 선언 전에 lazy 수정자를 붙여 나타냅니다.
- let은 인스턴스 초기화가 완료되기 전에 항상 값을 가지고 있어야 하기 때문에 lazy사용 불가능
- 인스턴스의 초기화가 완료될 때까지 값을 알 수 없는 외부 요인에 인해 초기값이 달라질 때 유용
- 프로퍼티의 초기값으로 필요할 때까지 수행하면 안되는 복잡하거나 계산 비용이 많이 드는 경우에도 유용합니다.
특정 상태에 따른 값을 연산하는 프로퍼티 (getter / setter)
적용 전
struct CoordinatePoint {
var x: Int
var y: Int
// 대칭점을 구하는 메서드 - 접근자(getter)
func oppsitePoint() -> CoordinatePoint {
return CoordinatePoint(x: -x, y: -y)
}
mutating func setOppositePoint(_ opposite: CoordinatePoint) {
x = -opposite.x
y = -opposite.y
}
}
var position: CoordinatePoint = CoordinatePoint(x: 10, y: 20)
//현재 좌표
print(position)
//대칭 좌표
print(position.oppsitePoint())
//대칭 좌표를 (15, 10)으로 설정
position.setOppositePoint(CoordinatePoint(x: 15, y: 10))
print(position) // -15, -10
적용 후
struct CoordinatePoint {
var x: Int
var y: Int
var oppsitionPoint: CoordinatePoint {
get {
return CoordinatePoint(x: 10, y: 20)
}
// set {
// x = -newValue.x
// y = -newValue.y
// }
set (someParam) {
x = -someParam.x
y = -someParam.y
}
}
}
=> 일관성을 유지하여 좀 더 명확하게 표현할 수 있음
저장 프로퍼티에서만 사용 가능
willSet
// 매개변수를 지정하지 않았을 때 newValue이 매개변수로 자동 저장
didSet
// 매개변수를 지정하지 않았을 때 oldValue이 매개변수로 자동 저장
class Account {
var credit: Int = 0 {
willSet {
print("잔액이 \(credit)에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet {
print("잔액이 \(oldValue)에서 \(credit)으로 변경되었습니다.")
}
}
}
let myAccount: Account = Account()
myAccount.credit = 1000
//잔액이 0에서 1000원으로 변경될 예정입니다.
//잔액이 0에서 1000으로 변경되었습니다.
각각의 인스턴스가 아닌 타입 자체에 속하게 되는 프로퍼티를 타입 프로퍼티라고 한다.
class Aclass {
// 저장 프로퍼티
static var typeProperty: Int = 0
var instanceProperty: Int = 0 {
didSet {
Aclass.typeProperty = instanceProperty + 100
}
}
// 연산 타입 프로퍼티
static var typeComputedProperty: Int {
get {
return typeProperty
}
set {
typeProperty = newValue
}
}
}
Aclass.typeProperty = 123
let classInstance: Aclass = Aclass()
classInstance.instanceProperty = 100
print(Aclass.typeProperty) // 200
print(Aclass.typeComputedProperty) // 200