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.0Elige 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:
2Las 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
falseUna 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 }
}Desafío
FácilPoint 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))")
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