Διαδρομές
/
Swift
Swift
/
Ασκήσεις
/
Γραμμές καταγραφής
Γραμμές καταγραφής

Γραμμές καταγραφής

Άσκηση εκμάθησης

Εισαγωγή

Όταν μοντελοποιείς δεδομένα που μπορούν να πάρουν μόνο ένα συγκεκριμένο σύνολο πιθανών καταστάσεων, όπως οι ημέρες της εβδομάδας, οι κατευθύνσεις της πυξίδας ή τα κουμπιά ενός χειριστηρίου, οι βασικοί τύποι όπως Int ή String έχουν σοβαρά μειονεκτήματα. Με ακέραιους ή συμβολοσειρές, ο κώδικάς σου πρέπει να ελέγχει διαρκώς για άκυρες τιμές (όπως έναν κωδικό κατάστασης 999 ή ένα τυπογραφικό λάθος όπως "leftt"), και οι ανθρώπινοι αναγνώστες δεν μπορούν να καταλάβουν εύκολα τι αντιπροσωπεύουν οι αριθμοί.

Η Swift λύνει αυτό το πρόβλημα με τις Απαριθμήσεις (συχνά συντομεύονται σε enums). Μια απαρίθμηση ορίζει έναν κοινό τύπο για μια ομάδα σχετιζόμενων, ονομασμένων τιμών. Επειδή ο μεταγλωττιστής γνωρίζει εκ των προτέρων όλες τις πιθανές περιπτώσεις, μπορεί να ελέγξει τον κώδικά σου για ορθότητα και πληρότητα κατά τον χρόνο μεταγλώττισης. Οι απαριθμήσεις μπορούν επίσης να έχουν μεθόδους, αρχικοποιητές και υπολογιζόμενες ιδιότητες.

Ορισμός απαριθμήσεων

Όρισε μια απαρίθμηση χρησιμοποιώντας τη λέξη-κλειδί enum ακολουθούμενη από το όνομα του τύπου, με τις περιπτώσεις της να παρατίθενται μέσα σε άγκιστρα. Κατά τη σύμβαση της Swift, το όνομα του τύπου χρησιμοποιεί UpperCamelCase, ενώ κάθε περίπτωση χρησιμοποιεί lowerCamelCase:

enum NESButton {
    case up
    case down
    case left
    case right
    case a
    case b
    case select
    case start
}

Μπορείς επίσης να ορίσεις πολλαπλές περιπτώσεις σε μία γραμμή, χωρισμένες με κόμματα:

enum NESButton {
    case up, down, left, right, a, b, select, start
}

Για να αναφερθείς σε μια περίπτωση απαρίθμησης, γράψε το όνομα του τύπου της απαρίθμησης, μια τελεία (.) και το όνομα της περίπτωσης. Όταν ο τύπος είναι γνωστός ή μπορεί να συναχθεί από τον μεταγλωττιστή, μπορείς να παραλείψεις το όνομα του τύπου και να χρησιμοποιήσεις τη συντομότερη σημειογραφία με τελεία:

var lastPressed = NESButton.up

// Swift infers the type, so you can omit the type name:
lastPressed = .down

let konamiCode: [NESButton] = [.up, .up, .down, .down, .left, .right, .left, .right, .b, .a]

Μέθοδοι και αρχικοποιητές

Οι απαριθμήσεις μπορούν να ορίσουν μεθόδους και προσαρμοσμένους αρχικοποιητές, ακριβώς όπως οι κλάσεις και οι δομές. Μέσα σε μια μέθοδο απαρίθμησης, το self αναφέρεται στην τρέχουσα τιμή της περίπτωσης:

enum Coin {
    case heads
    case tails

    init(_ value: Int) {
        if value.isMultiple(of: 2) {
            self = .heads
        } else {
            self = .tails
        }
    }

    func flip() -> Coin {
        switch self {
        case .heads: return .tails
        case .tails: return .heads
        }
    }
}

let tails = Coin(13)     // .tails
let heads = Coin(0)      // .heads
let flipped = heads.flip() // .tails

Ακατέργαστες τιμές

Οι περιπτώσεις μιας απαρίθμησης μπορούν να προσυμπληρωθούν με προεπιλεγμένες τιμές που ονομάζονται ακατέργαστες τιμές. Όλες οι ακατέργαστες τιμές σε μια απαρίθμηση πρέπει να είναι του ίδιου τύπου (όπως Int, String ή Character):

enum NESButton: Character {
    case up = "⬆️"
    case down = "⬇️"
    case left = "⬅️"
    case right = "➡️"
    case a = "🅰️"
    case b = "🅱️"
    case select = "✅"
    case start = "🚦"
}

print(NESButton.left.rawValue) // Prints "⬅️"

Μπορείς να αρχικοποιήσεις μια απαρίθμηση από μια ακατέργαστη τιμή χρησιμοποιώντας το init(rawValue:). Επειδή μπορεί να δοθεί μια άκυρη ακατέργαστη τιμή, αυτός ο αρχικοποιητής επιστρέφει ένα optional:

let upButton = NESButton(rawValue: "⬆️") // Optional(NESButton.up)
let invalid = NESButton(rawValue: "🙄")  // nil

Η Swift μπορεί να αναθέσει αυτόματα ακατέργαστες τιμές για απαριθμήσεις String και Int:

  • Στις απαριθμήσεις String, η ακατέργαστη τιμή κάθε περίπτωσης έχει ως προεπιλογή το όνομα της περίπτωσης.
  • Στις απαριθμήσεις Int, οι ακατέργαστες τιμές ξεκινούν από το 0 και αυξάνονται κατά 1, εκτός αν οριστεί διαφορετικά.
enum Planet: Int {
    case mercury = 1, venus, earth, mars
}

print(Planet.earth.rawValue) // Prints 3

Οδηγίες

Σε αυτή την άσκηση θα επεξεργάζεσαι γραμμές καταγραφής.

Κάθε γραμμή καταγραφής είναι μια συμβολοσειρά με την εξής μορφή: "[<LVL>]: <MESSAGE>".

Αυτά είναι τα διαφορετικά επίπεδα καταγραφής:

  • TRC (trace)
  • DBG (debug)
  • INF (info)
  • WRN (warning)
  • ERR (error)
  • FTL (fatal)

Έχεις τρεις εργασίες, καθεμία από τις οποίες πρέπει να ολοκληρωθεί για να παρέχεται η απαραίτητη λειτουργικότητα.

1. Δημιούργησε το enum LogLevel

Όρισε ένα enum LogLevel που έχει έξι περιπτώσεις οι οποίες αντιστοιχούν στα παραπάνω επίπεδα καταγραφής, συν μία άγνωστη περίπτωση για επίπεδα που λείπουν ή δεν ακολουθούν το πρότυπο.

  • trace
  • debug
  • info
  • warning
  • error
  • fatal
  • unknown

2. Ανάλυσε το επίπεδο καταγραφής

Στη συνέχεια, υλοποίησε τον αρχικοποιητή του LogLevel ώστε να αναλύει το επίπεδο καταγραφής μιας γραμμής καταγραφής:

LogLevel("[INF]: File deleted")
// Returns LogLevel.info
LogLevel("Something went wrong!")
// Returns LogLevel.unknown

3. Μετέτρεψε τη γραμμή καταγραφής σε σύντομη μορφή

Το επίπεδο καταγραφής μιας γραμμής καταγραφής είναι αρκετά αναλυτικό. Για να μειωθεί ο χώρος στον δίσκο που απαιτείται για την αποθήκευση των γραμμών καταγραφής, αναπτύχθηκε μια σύντομη μορφή: "<ENCODED_LEVEL>:<MESSAGE>".

Το κωδικοποιημένο επίπεδο καταγραφής είναι μια απλή αντιστοίχιση ενός επιπέδου καταγραφής σε έναν αριθμό:

  • trace - 0
  • debug - 1
  • info - 4
  • warning - 5
  • error - 6
  • fatal - 7
  • unknown - 42

Υλοποίησε τη μέθοδο shortFormat(message: String) -> String που μπορεί να παράγει τη συντομευμένη μορφή γραμμής καταγραφής ως String:

let overflow = LogLevel.error
overflow.shortFormat(message: "Stack overflow")
// Returns "6:Stack overflow"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Swift Exercism

Έτοιμος να ξεκινήσεις την άσκηση Γραμμές καταγραφής;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Swift με 35 έννοιες116 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.