Menu
Coddy logo textTech

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
false

Una 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:

4

let 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
99
challenge icon

Desafío

Fácil

Un 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) }
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