Las clases son referencias
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 5 de 57.
Una clase es un tipo de referencia: una variable contiene una referencia al objeto, no una copia de este. Asignar una instancia a otra variable proporciona un segundo nombre para el mismo objeto:
class Wallet {
var coins = 10
}
let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)Salida:
25=== comprueba si dos referencias apuntan a la misma instancia. Dos instancias separadas son objetos diferentes aunque todas sus propiedades coincidan:
class Wallet {
var coins = 10
}
let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)Salida:
true
falseUna función que recibe una instancia trabaja sobre el objeto del que se hizo la llamada, por lo que los cambios realizados dentro de la función siguen siendo visibles después:
class Wallet {
var coins = 10
}
func payFee(_ wallet: Wallet) {
wallet.coins -= 3
}
let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)Salida:
4let fija la referencia, no el objeto. Una constante que contiene una instancia de una clase no puede apuntar a otra instancia, pero las propiedades var de la instancia aún pueden cambiar. Los arrays de instancias también contienen referencias:
class Wallet {
var coins = 10
}
let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)Salida:
99
99Desafío
FácilUn equipo comparte un Budget. Completa spend(_:amount:), una función que recibe un presupuesto y resta el importe solo si queda suficiente, devolviendo true cuando se permitió el gasto. Después, completa runTeam(start:purchases:): crea un presupuesto, permite que cada compra gaste del mismo presupuesto y devuelve una línea por compra (ok 30 o denied 80), seguida de left 20.
El código proporcionado lee el presupuesto inicial y las compras como una línea separada por comas, e imprime cada línea devuelta.
Tu código va en Budget.swift y Functions.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
// Código de entrada/salida suministrado: déjalo 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) }
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 librosPractica por tu cuenta: Playground de Swift