Le classi sono riferimenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 5 di 57.
Una classe è un tipo di riferimento: una variabile contiene un riferimento all’oggetto, non una sua copia. Assegnare un’istanza a un’altra variabile dà un secondo nome allo stesso oggetto:
class Wallet {
var coins = 10
}
let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)Output:
25=== verifica se due riferimenti puntano alla stessa istanza. Due istanze separate sono oggetti diversi anche quando tutte le loro proprietà corrispondono:
class Wallet {
var coins = 10
}
let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)Output:
true
falseUna funzione che riceve un'istanza opera sull'oggetto del chiamante, quindi le modifiche apportate all'interno della funzione restano visibili in seguito:
class Wallet {
var coins = 10
}
func payFee(_ wallet: Wallet) {
wallet.coins -= 3
}
let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)Output:
4let fissa il riferimento, non l’oggetto. Una costante che contiene un’istanza di classe non può puntare a un’altra istanza, ma le proprietà var dell’istanza possono comunque cambiare. Anche gli array di istanze contengono riferimenti:
class Wallet {
var coins = 10
}
let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)Output:
99
99Sfida
FacileUna squadra condivide un unico Budget. Completa spend(_:amount:), una funzione che prende un budget e sottrae l'importo solo se ne rimane abbastanza, restituendo true quando la spesa è stata autorizzata. Poi completa runTeam(start:purchases:): crea un unico budget, fai in modo che ogni acquisto venga sottratto da quel medesimo budget e restituisci una riga per acquisto (ok 30 oppure denied 80), seguita da left 20.
Il codice fornito legge il budget iniziale e gli acquisti da una riga separata da virgole e stampa ogni riga restituita.
Il tuo codice va inserito in Budget.swift e Functions.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
// Código de entrada/salida proporcionado: déjalo tal como está
var input: [String] = []
while let line = readLine() { input.append(line) }
let purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { print(line) }
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
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libriEsercitati da solo: Playground Swift