Métodos y self
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 3 de 57.
Dentro de un método, self es la instancia sobre la que se llamó al método. self.count y count significan la misma propiedad, por lo que normalmente se omite self:
class Counter {
var count = 0
func increment() {
self.count += 1
}
}
let c = Counter()
c.increment()
print(c.count)Salida:
1Se necesita self cuando un parámetro tiene el mismo nombre que una propiedad. Después, el nombre simple significa el parámetro y self.name significa la propiedad:
class Player {
var name = "unknown"
func rename(name: String) {
self.name = name
}
}
let p = Player()
p.rename(name: "Ada")
print(p.name)Salida:
AdaLos métodos pueden llamar a otros métodos de la misma instancia, lo que mantiene cada método pequeño:
class Cart {
var total = 0
func add(_ price: Int) {
total += price
}
func addTwice(_ price: Int) {
add(price)
add(price)
}
}
let cart = Cart()
cart.addTwice(5)
print(cart.total)Salida:
10Un método también puede devolver un valor calculado a partir de las propiedades. Aquí isEmpty() responde a una pregunta sobre la instancia sin modificarla:
class Cart {
var items: [String] = []
func add(_ item: String) {
items.append(item)
}
func isEmpty() -> Bool {
items.count == 0
}
}
let cart = Cart()
print(cart.isEmpty())
cart.add("tea")
print(cart.isEmpty())Salida:
true
falseDesafío
FácilCompleta la clase Thermostat. setTarget(target:) almacena el parámetro en la propiedad target (usa self), warmer() aumenta el objetivo en 1 y display() devuelve target: 21.
El código proporcionado lee un objetivo inicial y una lista de comandos (warmer o set <n>), los aplica e imprime display() al final.
Tu código va en Thermostat.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 tal como está
var input: [String] = []
while let line = readLine() { input.append(line) }
let t = Thermostat()
t.setTarget(target: Int(input[0])!)
for cmd in input.dropFirst() {
if cmd == "warmer" { t.warmer() } else { t.setTarget(target: Int(cmd.dropFirst(4))!) }
}
print(t.display())
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