Comparable
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 39 di 57.
Comparable fornisce a un tipo gli operatori <, <=, > e >=. Implementi solo <; Swift deriva gli altri. I tipi Comparable possono essere ordinati con sorted() e usati con min() e 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)" })Output:
2.1
["1.9", "2.0", "2.1"]Il confronto tra tuple confronta i loro elementi in ordine, rendendo brevi i confronti con più chiavi. Qui le attività vengono ordinate prima per priorità e poi per nome:
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 })Output:
["fix", "call", "email"]Le enumerazioni senza valori associati possono conformarsi a Comparable senza scrivere <: i casi vengono confrontati nell'ordine in cui sono dichiarati:
enum Priority: Comparable {
case low, medium, high
}
print(Priority.low < Priority.high)
print([Priority.high, .low, .medium].sorted())Output:
true
[main.Priority.low, main.Priority.medium, main.Priority.high]sorted(by:) ordina secondo qualsiasi regola per una singola chiamata, mentre Comparable definisce l'ordine naturale del tipo, usato ovunque da sorted(), min() e max():
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 })Output:
["a", "c"]
["c", "a"]Sfida
FacileFai in modo che Runner (nome e tempo di arrivo come minutes, seconds) sia conforme a Comparable, dove un tempo più veloce è minore e, a parità di tempo, l’ordine è determinato dal nome. Completa podium(_:), che ordina i corridori con sorted() e restituisce righe come 1. Ada 20:05 per i primi tre (meno, se ci sono meno corridori), con i secondi formattati con due cifre.
Il codice fornito legge righe nel formato name,mm:ss e stampa ogni riga restituita.
Il tuo codice va inserito in Runner.swift e Functions.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
// Supplied input/output code: keep it as it is
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) }
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libriEsercitati da solo: Playground Swift