Menu
Coddy logo textTech

Struct o clase

Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 10 de 57.

La pauta de Swift es empezar con una estructura y elegir una clase solo cuando necesites algo que únicamente ofrecen las clases. Las estructuras son más sencillas: cada variable posee su propio valor, por lo que un cambio en un lugar nunca sorprende al código en otro lugar.

struct Temperature {
    var celsius: Double
}

var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)

Salida:

21.0

Elige una clase cuando un objeto deba ser compartido: varias partes del programa necesitan ver el mismo estado cambiante, como una cuenta bancaria utilizada por muchas pantallas. Las clases también admiten la herencia, a diferencia de las estructuras.

class SharedLog {
    var lines: [String] = []
}

let log = SharedLog()
let moduleA = log
let moduleB = log
moduleA.lines.append("A started")
moduleB.lines.append("B started")
print(log.lines.count)

Salida:

2

Las estructuras pueden obtener == de forma gratuita. Añade Equatable a la declaración y Swift compara cada propiedad; en cambio, las clases comparan la identidad con ===:

struct Point: Equatable {
    var x: Int
    var y: Int
}

print(Point(x: 1, y: 2) == Point(x: 1, y: 2))
print(Point(x: 1, y: 2) == Point(x: 2, y: 1))

Salida:

true
false

Una comprobación rápida: si dos elementos con los mismos datos deben contar como la misma cosa, usa un struct (un punto, un precio, una fecha). Si un elemento tiene una identidad que importa incluso cuando sus datos coinciden con los de otro (una cuenta de usuario, un archivo abierto), usa una clase.

struct Money { var cents: Int }          // 500 cents son 500 cents
class UserAccount {                      // dos cuentas pueden compartir un nombre
    let id: Int
    var name: String
    init(id: Int, name: String) { self.id = id; self.name = name }
}
challenge icon

Desafío

Fácil

Point es una estructura que debería poder compararse con ==. Añade la conformidad y completa countDistinct(_:), que devuelve cuántos puntos diferentes hay en la lista (dos puntos son iguales cuando ambas coordenadas coinciden).

El código proporcionado lee un punto por línea como x,y e imprime distinct: con el recuento.

Tu código va en Point.swift y Functions.swift. main.swift contiene el código de entrada/salida proporcionado 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 points = input.map { line -> Point in
    let p = line.split(separator: ",").map { Int($0)! }
    return Point(x: p[0], y: p[1])
}
print("distinct: \(countDistinct(points))")
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