프로퍼티 옵저버
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 13번째.
프로퍼티 옵저버는 저장 프로퍼티가 변경될 때마다 코드를 실행합니다. didSet은 새 값이 저장된 직후 실행되며, 그 안에서 oldValue는 이전 값을 담고 있습니다:
class Player {
var score = 0 {
didSet {
print("score \(oldValue) -> \(score)")
}
}
}
let p = Player()
p.score = 10
p.score += 5출력:
score 0 -> 10
score 10 -> 15willSet은 변경 전에 실행되며, 들어오는 값은 newValue입니다. 프로퍼티가 초기값을 받을 때는 옵저버가 실행되지 않습니다:
struct Thermostat {
var target = 20 {
willSet { print("changing to \(newValue)") }
didSet { print("changed from \(oldValue)") }
}
}
var t = Thermostat()
t.target = 22출력:
changing to 22
changed from 20didSet은 값을 유효한 상태로 유지하기에 좋은 곳입니다. 자체 didSet 안에서 프로퍼티에 값을 할당해도 옵저버가 다시 트리거되지 않습니다:
struct Volume {
var level = 5 {
didSet {
if level > 10 { level = 10 }
if level < 0 { level = 0 }
}
}
}
var v = Volume()
v.level = 42
print(v.level)
v.level = -3
print(v.level)출력:
10
0옵저버는 기록을 유지하거나 관련 상태를 업데이트할 수도 있으므로, 해당 로직이 코드 곳곳에 흩어지지 않고 프로퍼티와 함께 유지됩니다:
class Account {
var history: [Int] = []
var balance = 0 {
didSet { history.append(balance - oldValue) }
}
}
let a = Account()
a.balance = 100
a.balance = 70
print(a.history)출력:
[100, -30]챌린지
쉬움Tank 클래스를 완성하세요. 저장 프로퍼티 level은 0과 capacity 사이를 유지해야 합니다. 이 범위를 벗어난 값을 수정하는 didSet을 추가하고, 수정된 level이 capacity의 20% 미만으로 끝나며 이전 level이 낮은 상태가 아니었던 경우 low 경고를 alerts에 추가하세요.
제공된 코드는 capacity를 읽은 다음 +n 또는 -n만큼 변경합니다. 각 변경 후 level을 출력하고, 마지막으로 경고 수와 함께 alerts: 를 출력합니다.
코드는 Tank.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.
직접 해보기
// 제공된 입력/출력 코드: 있는 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let tank = Tank(capacity: Int(input[0])!)
for cmd in input.dropFirst() {
let n = Int(cmd.dropFirst())!
tank.level += cmd.hasPrefix("+") ? n : -n
print(tank.level)
}
print("alerts: \(tank.alerts.count)")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드