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 é privadoSaída:
1Isso 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 10Desafio
FácilComplete 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)")
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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesMétodos e selfInicializadoresClasses são ReferênciasRevisão - Cartão da Biblioteca4Encapsulamento
Controle de AcessoSomente Leitura ExternaProtegendo o EstadoInicializadores que Podem FalharRevisão - Conta Bancária7Polimorfismo e Genéricos
PolimorfismoConversão de TiposFunções GenéricasTipos GenéricosRevisão - Calculadora de Formas2Structs e Tipos de Valor
StructsSemântica de ValorMétodos MutáveisStruct ou ClasseRecapitulação - Item de Inventário5Herança
SubclassesSobrescrita de métodosInicializadores e superfinal e hierarquiasRecapitulação - Hierarquia de funcionários8Protocolos Padrão
CustomStringConvertibleEquatableComparableHashableRecapitulação - Ordenação Personalizada11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Swift