Menu
Coddy logo textTech

Proprietà calcolate

Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 12 di 57.

Una proprietà memorizzata contiene un valore. Una proprietà calcolata non ha memoria: esegue il codice ogni volta che viene letta e restituisce un valore calcolato da altre proprietà:

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)

Output:

12.0
40.0

Poiché il valore viene ricalcolato a ogni lettura, una proprietà calcolata non può mai essere obsoleta. Si legge come una proprietà memorizzata, senza parentesi:

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)

Output:

Ada Lovelace

Una proprietà calcolata può avere anche un setter. set riceve il nuovo valore come newValue e aggiorna le proprietà memorizzate da cui dipende:

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)

Output:

212.0
0.0

Usa una proprietà calcolata per un valore che deriva da altri ed è facile da calcolare. Usa un metodo quando il lavoro richiede argomenti o è costoso:

struct Order {
    var items: [Int]
    var total: Int { items.reduce(0, +) }           // proprietà: nessun argomento
    func total(withTax rate: Int) -> Int {           // metodo: accetta un argomento
        total + total * rate / 100
    }
}
challenge icon

Sfida

Facile

Completa la struct Circle con una proprietà memorizzata radius e tre proprietà calcolate di sola lettura: diameter (il doppio del raggio), area (π r², usando Double.pi) e label, che restituisce r=2.0 d=4.0 a=12.57 con l’area arrotondata a due decimali usando String(format: "%.2f", area).

Il codice fornito legge un raggio per riga, crea un Circle e stampa label. Poi raddoppia il raggio dell’ultimo cerchio e stampa di nuovo il suo label, quindi i valori devono seguire il raggio.

Il tuo codice va in Circle.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

import Foundation

// Codice di input/output fornito: lascialo così com'è
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Swift