Menu
Coddy logo textTech

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.0

Como 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 Lovelace

Una 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.0

Usa 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
    }
}
challenge icon

Desafío

Fácil

Completa 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)
quiz iconPonte a prueba

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

Practica por tu cuenta: Playground de Swift