Propriedades Computadas
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 12 de 57.
Uma propriedade armazenada contém um valor. Uma propriedade computada não possui armazenamento: ela executa código cada vez que é lida e retorna um valor calculado a partir de outras propriedades:
struct Rectangle {
var width: Double
var height: Double
var area: Double {
width * height
}
}
var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)Saída:
12.0
40.0Como o valor é recalculado a cada leitura, uma propriedade computada nunca pode ficar desatualizada. Ela é lida como uma propriedade armazenada, sem parênteses:
struct Person {
var first: String
var last: String
var fullName: String {
"\(first) \(last)"
}
}
var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)Saída:
Ada LovelaceUma propriedade computada também pode ter um setter. set recebe o novo valor como newValue e atualiza as propriedades armazenadas nas quais se baseia:
struct Temperature {
var celsius: Double
var fahrenheit: Double {
get { celsius * 9 / 5 + 32 }
set { celsius = (newValue - 32) * 5 / 9 }
}
}
var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)Saída:
212.0
0.0Use uma propriedade computada para um valor que deriva de outros e é barato de calcular. Use um método quando o trabalho recebe argumentos ou é dispendioso:
struct Order {
var items: [Int]
var total: Int { items.reduce(0, +) } // propriedade: sem argumentos
func total(withTax rate: Int) -> Int { // método: recebe um argumento
total + total * rate / 100
}
}Desafio
FácilComplete a struct Circle com uma propriedade armazenada radius e três propriedades calculadas somente para leitura: diameter (o dobro do raio), area (π r², usando Double.pi) e label, que retorna r=2.0 d=4.0 a=12.57 com a área arredondada para duas casas decimais usando String(format: "%.2f", area).
O código fornecido lê um raio por linha, cria um Circle e imprime label. Em seguida, ele dobra o raio do último círculo e imprime seu label novamente, portanto os valores devem acompanhar o raio.
Seu código deve estar em Circle.swift. main.swift contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
import Foundation
// Código de entrada/saída fornecido: mantenha-o como está
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
last = Circle(radius: Double(line)!)
print(last.label)
}
last.radius *= 2
print(last.label)
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 Livros3Propriedades em Profundidade
Propriedades ComputadasObservadores de PropriedadesMembros EstáticosEnums com MétodosRecapitulação - Registro de TemperaturaPratique por conta própria: Playground de Swift