.count }.reduce(0, +) return Int(round(Double(size) / Double(count.toIntMax()))) } }

Τώρα μπορούμε να υπολογίσουμε το μέσο μέγεθος κάθε συλλογής ουρών (Array, Set, κ.λπ.). Χωρίς επεκτάσεις πρωτοκόλλου, θα χρειαζόμασταν να προσθέσουμε αυτήν τη μέθοδο σε κάθε τύπο συλλογής ξεχωριστά.

Στην τυπική βιβλιοθήκη Swift, οι επεκτάσεις πρωτοκόλλου χρησιμοποιούνται για την εφαρμογή, για παράδειγμα, μεθόδων όπως map, filter, reduce κ.λπ.

σε τι γράφεται ο κόμβος js
extension Collection { public func map(_ transform: (Self.Iterator.Element) throws -> T) rethrows -> [T] { } }

Επεκτάσεις πρωτοκόλλου και πολυμορφισμός

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

protocol ErrorHandler { func handle(error: Error) } extension ErrorHandler { func handle(error: Error) { print(error.localizedDescription) } } struct Handler: ErrorHandler { func handle(error: Error) { fatalError('Unexpected error occurred') } } enum ApplicationError: Error { case other } let handler: Handler = Handler() handler.handle(error: ApplicationError.other)

Το αποτέλεσμα είναι ένα θανατηφόρο σφάλμα.

Τώρα αφαιρέστε το handle(error: Error) δήλωση μεθόδου από το πρωτόκολλο.

protocol ErrorHandler { }

Το αποτέλεσμα είναι το ίδιο: ένα μοιραίο σφάλμα.

Σημαίνει ότι δεν υπάρχει διαφορά μεταξύ της προσθήκης μιας προεπιλεγμένης εφαρμογής της μεθόδου πρωτοκόλλου και της προσθήκης μιας νέας εφαρμογής μεθόδου στο πρωτόκολλο;

Οχι! Υπάρχει μια διαφορά και μπορείτε να τη δείτε αλλάζοντας τον τύπο της μεταβλητής handler από Handler έως ErrorHandler.

let handler: ErrorHandler = Handler()

Τώρα η έξοδος στην κονσόλα είναι: Δεν ήταν δυνατή η ολοκλήρωση της λειτουργίας. (Σφάλμα ApplicationError 0.)

Αλλά αν επιστρέψουμε τη δήλωση της μεθόδου λαβής (σφάλμα: Σφάλμα) στο πρωτόκολλο, το αποτέλεσμα θα αλλάξει ξανά στο μοιραίο σφάλμα.

protocol ErrorHandler { func handle(error: Error) }

Ας δούμε τη σειρά του τι συμβαίνει σε κάθε περίπτωση.

Όταν υπάρχει δήλωση μεθόδου στο πρωτόκολλο:

Το πρωτόκολλο δηλώνει το handle(error: Error) μέθοδος και παρέχει μια προεπιλεγμένη εφαρμογή. Η μέθοδος παρακάμπτεται στο Handler εκτέλεση. Επομένως, απαιτείται η σωστή εφαρμογή της μεθόδου κατά το χρόνο εκτέλεσης, ανεξάρτητα από τον τύπο της μεταβλητής.

Όταν η δήλωση μεθόδου δεν υπάρχει στο πρωτόκολλο:

Επειδή η μέθοδος δεν δηλώνεται στο πρωτόκολλο, ο τύπος δεν μπορεί να την παρακάμψει. Αυτός είναι ο λόγος για τον οποίο η εφαρμογή μιας μεθόδου που ονομάζεται εξαρτάται από τον τύπο της μεταβλητής.

Εάν η μεταβλητή είναι τύπου Handler, καλείται η εφαρμογή της μεθόδου από τον τύπο. Σε περίπτωση που η μεταβλητή είναι τύπου ErrorHandler, καλείται η εφαρμογή της μεθόδου από την επέκταση πρωτοκόλλου.

Κωδικός προσανατολισμένος στο πρωτόκολλο: Ασφαλής αλλά εκφραστικός

Σε αυτό το άρθρο, επιδείξαμε μερικές από τις δυνατότητες των επεκτάσεων πρωτοκόλλου στο Swift.

Σε αντίθεση με άλλες γλώσσες προγραμματισμού με διασυνδέσεις, το Swift δεν περιορίζει πρωτόκολλα με περιττούς περιορισμούς. Το Swift λειτουργεί γύρω από κοινές ιδέες αυτών των γλωσσών προγραμματισμού επιτρέποντας στον προγραμματιστή να επιλύσει την ασάφεια, όπως απαιτείται.

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

Ελπίζουμε ότι αυτό το άρθρο θα είναι χρήσιμο για εσάς και θα καλωσορίσουμε τυχόν σχόλια ή περαιτέρω πληροφορίες.