Menu
Coddy logo textTech

외부에서는 읽기 전용

Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 18번째.

코드 외부에서는 속성을 읽기만 하고 변경하지 않아야 하는 경우가 많습니다. private(set)은 getter를 일반적인 수준으로 유지하고 setter만 private으로 만듭니다:

struct Counter {
    private(set) var count = 0

    mutating func increment() {
        count += 1
    }
}

var c = Counter()
c.increment()
print(c.count)
// c.count = 99   // 오류: setter가 private임

출력:

1

이는 규칙을 통해서만 변경되어야 하는 값에 적합합니다. 예를 들어 유효한 동작을 통해서만 증가하는 점수입니다:

class Player {
    let name: String
    private(set) var score = 0
    private(set) var history: [Int] = []

    init(name: String) { self.name = name }

    func award(_ points: Int) {
        guard points > 0 else { return }
        score += points
        history.append(points)
    }
}

let p = Player(name: "Ada")
p.award(10)
p.award(-5)
p.award(3)
print(p.score)
print(p.history)

출력:

13
[10, 3]

let 프로퍼티는 인스턴스가 생성된 후에는 해당 타입의 메서드를 포함한 누구에게도 읽기 전용입니다. private(set) var는 타입 내부에서 변경할 수 있는 상태로 유지됩니다. 생성 후에도 절대 변경되지 않는 값에는 let을 선택하세요:

class Order {
    let id: Int                 // 절대 변경되지 않음
    private(set) var status = "new"   // 변경되지만 Order 내부에서만
    init(id: Int) { self.id = id }
    func ship() { status = "shipped" }
}

읽기 전용 계산 프로퍼티는 변경을 허용하지 않고 정보를 노출하는 또 다른 방법입니다. setter가 전혀 없기 때문입니다:

struct Cart {
    private var prices: [Int] = []
    var total: Int { prices.reduce(0, +) }
    var count: Int { prices.count }

    mutating func add(_ price: Int) { prices.append(price) }
}

var cart = Cart()
cart.add(4)
cart.add(6)
print("\(cart.count) items, total \(cart.total)")

출력:

2 items, total 10
challenge icon

챌린지

쉬움

Elevator 클래스를 완성하세요. floor와 trips는 외부에서 읽을 수 있지만 클래스에서만 변경할 수 있습니다(private(set)). goTo(_:)는 0층과 topFloor 사이에서 이동합니다. 다른 층으로 이동하는 유효한 이동은 floor를 업데이트하고 trips에 1을 더한 후 true를 반환합니다. 유효하지 않은 이동이나 현재 층과 같은 층으로의 이동은 false를 반환합니다.

제공된 코드는 최고 층을 읽은 다음 목표 층들을 읽습니다. 이동 후에는 floor 3을 출력하고, 이동이 거부되면 stay 3을 출력하며, 마지막으로 횟수와 함께 trips: 를 출력합니다.

작성한 코드는 Elevator.swift에 넣으세요. main.swift에는 제공된 입력/출력 코드가 있으며 편집할 수 없습니다.

직접 해보기

// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let lift = Elevator(topFloor: Int(input[0])!)
for line in input.dropFirst() {
    let moved = lift.goTo(Int(line)!)
    print("\(moved ? "floor" : "stay") \(lift.floor)")
}
print("trips: \(lift.trips)")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Swift 플레이그라운드