Menu
Coddy logo textTech

Somente Leitura Externa

Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 18 de 57.

Muitas vezes, o código externo deve ler uma propriedade, mas não alterá-la. private(set) mantém o getter no nível normal e torna apenas o setter privado:

struct Counter {
    private(set) var count = 0

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

var c = Counter()
c.increment()
print(c.count)
// c.count = 99   // erro: o setter é privado

Saída:

1

Isso se aplica a valores que só devem ser alterados por meio de uma regra, como uma pontuação que só aumenta por meio de ações válidas:

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)

Saída:

13
[10, 3]

Uma propriedade let é somente leitura para todos depois que a instância existe, incluindo os próprios métodos do tipo. private(set) var continua podendo ser alterada dentro do tipo. Escolha let para valores que nunca mudam após a criação:

class Order {
    let id: Int                 // nunca muda
    private(set) var status = "new"   // muda, mas apenas dentro de Order
    init(id: Int) { self.id = id }
    func ship() { status = "shipped" }
}

Uma propriedade computada somente para leitura é outra forma de expor informações sem permitir alterações, pois ela não tem nenhum 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)")

Saída:

2 items, total 10
challenge icon

Desafio

Fácil

Complete a classe Elevator. floor e trips podem ser lidos externamente, mas só podem ser alterados pela classe (private(set)). goTo(_:) move-se entre o andar 0 e topFloor: um movimento válido para um andar diferente atualiza floor, adiciona 1 a trips e retorna true; um movimento inválido ou para o mesmo andar retorna false.

O código fornecido lê o andar superior e, em seguida, os andares de destino. Ele imprime floor 3 após um movimento ou stay 3 quando o movimento é recusado e, por fim, trips: com a contagem.

Seu código deve ficar em Elevator.swift. main.swift contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

// Código de entrada/saída fornecido: mantenha-o como está
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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Playground de Swift