변경 메서드
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 9번째.
속성을 변경하는 구조체 메서드는 mutating으로 표시해야 합니다. 이 키워드가 없으면 값 타입의 메서드는 self를 상수로 취급하므로 메서드가 컴파일되지 않습니다:
struct Counter {
var count = 0
mutating func increment() {
count += 1
}
}
var c = Counter()
c.increment()
c.increment()
print(c.count)출력:
2변경 메서드는 var에 대해서만 호출할 수 있습니다. let 상수에서는 전체 값이 고정되어 있으므로 호출이 컴파일되지 않습니다:
var a = Counter()
a.increment() // 괜찮음
let b = Counter()
// b.increment() // 오류: b는 let 상수입니다속성을 읽기만 하는 메서드는 비변경 상태를 유지하며 상수에서도 작동합니다. 좋은 설계는 변경을 수행하는 몇 가지 메서드에만 집중합니다:
struct Stack {
var items: [Int] = []
mutating func push(_ x: Int) { items.append(x) }
mutating func pop() -> Int? { items.popLast() }
func peek() -> Int? { items.last }
}
var s = Stack()
s.push(3)
s.push(8)
print(s.pop() ?? -1)
print(s.peek() ?? -1)출력:
8
3변경 메서드는 self를 완전히 대체할 수 있으므로 값을 재설정할 때 유용합니다:
struct Score {
var points = 0
var bonus = 0
mutating func reset() {
self = Score()
}
}
var s = Score(points: 10, bonus: 3)
s.reset()
print(s.points + s.bonus)출력:
0챌린지
쉬움Wallet 구조체를 완성하세요. add(_:)와 spend(_:)는 변경 가능한 메서드입니다. spend는 남은 금액이 충분할 때만 차감하고, 차감이 이루어졌는지를 반환합니다. report()는 변경 가능한 메서드가 아니며 balance 40을 반환합니다.
제공된 코드는 +n 및 -n 명령을 읽고, 이를 하나의 var 지갑에 적용하며, 지출이 거부되면 denied를 출력하고, 마지막으로 report()를 출력합니다.
코드는 Wallet.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.
직접 해보기
// 제공된 입/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
var wallet = Wallet()
for cmd in input {
let amount = Int(cmd.dropFirst())!
if cmd.hasPrefix("+") {
wallet.add(amount)
} else if !wallet.spend(amount) {
print("denied")
}
}
print(wallet.report())
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드