Comparable
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 39 de 57.
Comparable proporciona a un tipo los operadores <, <=, > y >=. Solo implementas <; Swift deriva el resto. Los tipos Comparable se pueden ordenar con sorted() y usar con min() y max():
struct Version: Comparable {
let major: Int, minor: Int
static func < (lhs: Version, rhs: Version) -> Bool {
(lhs.major, lhs.minor) < (rhs.major, rhs.minor)
}
}
let versions = [Version(major: 2, minor: 1), Version(major: 1, minor: 9), Version(major: 2, minor: 0)]
let newest = versions.max()!
print("\(newest.major).\(newest.minor)")
print(versions.sorted().map { "\($0.major).\($0.minor)" })Salida:
2.1
["1.9", "2.0", "2.1"]Comparar tuplas compara sus partes en orden, lo que hace que las comparaciones con varias claves sean breves. Aquí las tareas se ordenan primero por prioridad y después por nombre:
struct Task: Comparable {
let priority: Int
let name: String
static func < (lhs: Task, rhs: Task) -> Bool {
(lhs.priority, lhs.name) < (rhs.priority, rhs.name)
}
}
let tasks = [Task(priority: 2, name: "email"), Task(priority: 1, name: "fix"), Task(priority: 2, name: "call")]
print(tasks.sorted().map { $0.name })Salida:
["fix", "call", "email"]Los enums sin valores asociados pueden conformarse a Comparable sin escribir <: los casos se comparan en el orden en que se declaran:
enum Priority: Comparable {
case low, medium, high
}
print(Priority.low < Priority.high)
print([Priority.high, .low, .medium].sorted())Salida:
true
[main.Priority.low, main.Priority.medium, main.Priority.high]sorted(by:) ordena según cualquier regla para una llamada, mientras que Comparable define el orden natural del tipo que sorted(), min() y max() usan en todas partes:
struct Task: Comparable {
let priority: Int
let name: String
static func < (lhs: Task, rhs: Task) -> Bool { lhs.priority < rhs.priority }
}
let tasks = [Task(priority: 3, name: "c"), Task(priority: 1, name: "a")]
print(tasks.sorted().map { $0.name })
print(tasks.sorted(by: >).map { $0.name })Salida:
["a", "c"]
["c", "a"]Desafío
FácilHaz que Runner (nombre y tiempo de llegada como minutes, seconds) cumpla con Comparable, donde un tiempo más rápido sea menor y los tiempos iguales se ordenen por nombre. Completa podium(_:), que ordena los corredores con sorted() y devuelve líneas 1. Ada 20:05 para los tres primeros (menos si hay menos corredores), con los segundos completados hasta dos dígitos.
El código proporcionado lee líneas con el formato name,mm:ss e imprime cada línea devuelta.
Tu código debe ir en Runner.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: mantenlo como está
var input: [String] = []
while let line = readLine() { input.append(line) }
let runners = input.map { line -> Runner in
let p = line.split(separator: ",").map(String.init)
let t = p[1].split(separator: ":").map { Int($0)! }
return Runner(name: p[0], minutes: t[0], seconds: t[1])
}
for line in podium(runners) { 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