Propiedades calculadas
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 12 de 57.
Una propiedad almacenada contiene un valor. Una propiedad calculada no tiene almacenamiento: ejecuta código cada vez que se lee y devuelve un valor calculado a partir de otras propiedades:
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)Salida:
12.0
40.0Como el valor se recalcula en cada lectura, una propiedad calculada nunca puede estar desactualizada. Se lee como una propiedad almacenada, sin paréntesis:
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)Salida:
Ada LovelaceUna propiedad calculada también puede tener un setter. set recibe el nuevo valor como newValue y actualiza las propiedades almacenadas en las que se basa:
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)Salida:
212.0
0.0Usa una propiedad calculada para un valor que se deriva de otros y cuyo cálculo es económico. Usa un método cuando el trabajo recibe argumentos o es costoso:
struct Order {
var items: [Int]
var total: Int { items.reduce(0, +) } // propiedad: sin argumentos
func total(withTax rate: Int) -> Int { // método: toma un argumento
total + total * rate / 100
}
}Desafío
FácilCompleta la estructura Circle con una propiedad almacenada radius y tres propiedades calculadas de solo lectura: diameter (el doble del radio), area (π r², usando Double.pi) y label, que devuelve r=2.0 d=4.0 a=12.57 con el área redondeada a dos decimales mediante String(format: "%.2f", area).
El código proporcionado lee un radio por línea, crea un Circle e imprime label. Después duplica el radio del último círculo e imprime de nuevo su label, por lo que los valores deben seguir al radio.
Tu código debe ir en Circle.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
import Foundation
// Código de entrada/salida suministrado: déjalo tal 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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de libros3Propiedades en profundidad
Propiedades calculadasObservadores de propiedadesMiembros estáticosEnumeraciones con métodosRepaso - Registro de temperaturaPractica por tu cuenta: Playground de Swift