Menu
Coddy logo textTech

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

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

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

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

Desafio

Fácil

Complete 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)
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