Menu
Coddy logo textTech

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"]
challenge icon

Sfida

Facile

Fai 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) }
quiz iconMettiti alla prova

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

Esercitati da solo: Playground Swift