Προγραμματισμός

Swift εναντίον Objective-C: 10 λόγοι που το μέλλον ευνοεί το Swift

Οι γλώσσες προγραμματισμού δεν πεθαίνουν εύκολα, αλλά τα καταστήματα ανάπτυξης που προσκολλώνται στα εξασθενημένα πρότυπα. Εάν αναπτύσσετε εφαρμογές για κινητές συσκευές και δεν έχετε διερευνήσει το Swift, λάβετε υπόψη: Το Swift δεν θα αντικαταστήσει μόνο το Objective-C όταν πρόκειται για την ανάπτυξη εφαρμογών για Mac, iPhone, iPad, Apple Watch και συσκευές που θα έρθουν, αλλά θα αντικαταστήσει επίσης το C για ενσωματωμένο προγραμματισμό σε πλατφόρμες της Apple.

Χάρη σε πολλά βασικά χαρακτηριστικά, το Swift έχει τη δυνατότητα να γίνει η de-facto γλώσσα προγραμματισμού για τη δημιουργία καθηλωτικών, ανταποκρινόμενων, καταναλωτικών εφαρμογών για τα επόμενα χρόνια.

Η Apple φαίνεται να έχει μεγάλους στόχους για το Swift. Έχει βελτιστοποιήσει τον μεταγλωττιστή για απόδοση και τη γλώσσα ανάπτυξης και υπαινίσσεται ότι το Swift είναι «σχεδιασμένο να κλιμακωθεί από« γεια, κόσμος »σε ένα ολόκληρο λειτουργικό σύστημα» στην τεκμηρίωση του Swift. Ενώ η Apple δεν έχει δηλώσει ακόμη όλους τους στόχους της για τη γλώσσα, οι εκκινήσεις των Xcode 6, Playgrounds και Swift σηματοδοτούν από κοινού την πρόθεση της Apple να κάνει την ανάπτυξη εφαρμογών ευκολότερη και πιο προσιτή από ό, τι με οποιαδήποτε άλλη αλυσίδα εργαλείων ανάπτυξης.

Εδώ είναι 10 λόγοι για να προχωρήσετε στο παιχνίδι αρχίζοντας να συνεργάζεστε με το Swift τώρα.

1. Το Swift είναι ευκολότερο να διαβαστεί

Το Objective-C υποφέρει όλα τα κονδυλώματα που θα περιμένατε από μια γλώσσα που βασίζεται στο C. Για να διαφοροποιήσετε τις λέξεις-κλειδιά και τους τύπους από τους τύπους C, το Objective-C εισήγαγε νέες λέξεις-κλειδιά χρησιμοποιώντας το σύμβολο @. Επειδή το Swift δεν είναι ενσωματωμένο στο C, μπορεί να ενοποιήσει όλες τις λέξεις-κλειδιά και να αφαιρέσει τα πολλά σύμβολα @ μπροστά από κάθε τύπο Objective-C ή λέξη-κλειδί που σχετίζεται με αντικείμενο.

Swift σταγόνες παλαιού τύπου συμβάσεις. Επομένως, δεν χρειάζεστε πλέον ερωτηματικά για τελικές γραμμές ή παρενθέσεις για να περιβάλλετε υπό όρους εκφράσεις μέσα σε δηλώσεις if / else. Μια άλλη μεγάλη αλλαγή είναι ότι οι κλήσεις μεθόδου δεν φωλιάζουν το ένα το άλλο, με αποτέλεσμα το bracket hell-bye-bye, [[[ ]]]. Οι μέθοδοι και οι κλήσεις συνάρτησης στο Swift χρησιμοποιούν τη λίστα παραμέτρων που διαχωρίζονται με κόμμα από το βιομηχανικό πρότυπο εντός παρενθέσεων. Το αποτέλεσμα είναι μια καθαρότερη, πιο εκφραστική γλώσσα με απλοποιημένη σύνταξη και γραμματική.

Ο κωδικός Swift μοιάζει περισσότερο με τα φυσικά αγγλικά, εκτός από άλλες σύγχρονες δημοφιλείς γλώσσες προγραμματισμού. Αυτή η αναγνωσιμότητα διευκολύνει τους υπάρχοντες προγραμματιστές από JavaScript, Java, Python, C # και C ++ να υιοθετήσουν το Swift στην αλυσίδα εργαλείων τους - σε αντίθεση με το άσχημο παπάκι που ήταν ο Objective-C.

2. Το Swift είναι ευκολότερο να συντηρηθεί

Η κληρονομιά είναι αυτό που κρατά πίσω τον Στόχο-Γ - η γλώσσα δεν μπορεί να εξελιχθεί χωρίς να εξελιχθεί ο Γ. Το C απαιτεί από τους προγραμματιστές να διατηρούν δύο αρχεία κώδικα προκειμένου να βελτιώσουν τον χρόνο κατασκευής και την αποτελεσματικότητα της δημιουργίας εκτελέσιμων εφαρμογών, μια απαίτηση που μεταφέρει τον Objective-C.

Το Swift μειώνει την απαίτηση δύο αρχείων. Ο κωδικός Xcode και ο μεταγλωττιστής LLVM μπορούν να εντοπίσουν εξαρτήσεις και να εκτελούν αυτόματα αυξητικές εκδόσεις στο Swift 1.2. Ως αποτέλεσμα, η επαναλαμβανόμενη εργασία του διαχωρισμού του πίνακα περιεχομένων (αρχείο κεφαλίδας) από το σώμα (αρχείο υλοποίησης) είναι κάτι του παρελθόντος. Το Swift συνδυάζει την κεφαλίδα Objective-C (.h) και τα αρχεία υλοποίησης (.m) σε ένα αρχείο κώδικα (.swift).

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

Το Xcode και ο μεταγλωττιστής LLVM μπορούν να δουλέψουν πίσω από τα παρασκήνια για να μειώσουν τον φόρτο εργασίας του προγραμματιστή. Με το Swift, οι προγραμματιστές κάνουν λιγότερη τήρηση βιβλίων και μπορούν να ξοδέψουν περισσότερο χρόνο δημιουργώντας λογική εφαρμογών. Η Swift κόβει τη δουλειά του boilerplate και βελτιώνει την ποιότητα του κώδικα, των σχολίων και των χαρακτηριστικών που υποστηρίζονται.

3. Το Swift είναι ασφαλέστερο

Μια ενδιαφέρουσα πτυχή του Στόχου-Γ είναι ο τρόπος με τον οποίο χειρίζονται οι δείκτες –ιδίως οι μηδενικοί δείκτες–. Στο Objective-C, τίποτα δεν συμβαίνει εάν προσπαθήσετε να καλέσετε μια μέθοδο με μια μεταβλητή δείκτη που είναι μηδενική (μη αρχικοποιημένη). Η έκφραση ή η γραμμή κώδικα γίνεται μη λειτουργία (no-op), και ενώ μπορεί να φαίνεται ευεργετικό ότι δεν συντρίβεται, υπήρξε μια τεράστια πηγή σφαλμάτων. Το no-op οδηγεί σε απρόβλεπτη συμπεριφορά, που είναι ο εχθρός των προγραμματιστών που προσπαθούν να βρουν και να διορθώσουν ένα τυχαίο σφάλμα ή να σταματήσουν την ακανόνιστη συμπεριφορά.

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

Παραδοσιακά, στο Objective-C, εάν μια τιμή επιστράφηκε από μια μέθοδο, ήταν ευθύνη του προγραμματιστή να τεκμηριώσει τη συμπεριφορά της μεταβλητής δείκτη που επιστράφηκε (χρησιμοποιώντας σχόλια και συμβάσεις ονομασίας μεθόδου). Στο Swift, οι προαιρετικοί τύποι και τύποι τιμών το καθιστούν σαφώς σαφή στον ορισμό της μεθόδου εάν η τιμή υπάρχει ή εάν έχει τη δυνατότητα να είναι προαιρετική (δηλαδή, η τιμή μπορεί να υπάρχει ή μπορεί να είναι μηδενική).

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

4. Το Swift ενοποιείται με τη διαχείριση μνήμης

Το Swift ενοποιεί τη γλώσσα με τρόπο που δεν έχει ποτέ ο Objective-C. Η υποστήριξη για αυτόματη μέτρηση αναφοράς (ARC) είναι πλήρης σε όλες τις διαδικαστικές και αντικειμενοστραφείς διαδρομές κώδικα. Στο Objective-C, το ARC υποστηρίζεται εντός των API κακάου και αντικειμενοστραφούς κώδικα. Δεν είναι διαθέσιμο, ωστόσο, για διαδικαστικό κώδικα C και API όπως το Core Graphics. Αυτό σημαίνει ότι αποτελεί ευθύνη του προγραμματιστή να χειρίζεται τη διαχείριση μνήμης όταν εργάζεται με τα Core Graphics API και άλλα API χαμηλού επιπέδου που είναι διαθέσιμα στο iOS. Οι τεράστιες διαρροές μνήμης που μπορεί να έχει ένας προγραμματιστής στο Objective-C είναι αδύνατες στο Swift.

Ένας προγραμματιστής δεν πρέπει να σκέφτεται τη μνήμη για κάθε ψηφιακό αντικείμενο που δημιουργεί. Επειδή το ARC χειρίζεται όλη τη διαχείριση μνήμης κατά τη στιγμή της μεταγλώττισης, η δύναμη του εγκεφάλου που θα είχε προχωρήσει στη διαχείριση της μνήμης μπορεί αντ 'αυτού να επικεντρωθεί στη βασική λογική εφαρμογών και σε νέες λειτουργίες. Επειδή το ARC στο Swift λειτουργεί τόσο σε διαδικαστικούς όσο και σε αντικειμενοστραφείς κώδικες, δεν απαιτεί πλέον πνευματικούς διακόπτες περιβάλλοντος για προγραμματιστές, ακόμη και όταν γράφουν κώδικα που αγγίζει API χαμηλότερου επιπέδου - πρόβλημα με την τρέχουσα έκδοση του Objective-C.

Η αυτόματη διαχείριση μνήμης υψηλής απόδοσης είναι ένα πρόβλημα που έχει επιλυθεί και η Apple έχει αποδείξει ότι μπορεί να αυξήσει την παραγωγικότητα. Η άλλη ανεπιθύμητη ενέργεια είναι ότι τόσο το Objective-C όσο και το Swift δεν πάσχουν από έναν συλλέκτη απορριμμάτων που εκτελεί καθαρισμό για μη χρησιμοποιημένη μνήμη, όπως Java, Go ή C #. Αυτός είναι ένας σημαντικός παράγοντας για οποιαδήποτε γλώσσα προγραμματισμού που θα χρησιμοποιηθεί για γραφικά απόκρισης και είσοδο χρήστη, ειδικά σε μια συσκευή αφής όπως το iPhone, το Apple Watch ή το iPad (όπου η καθυστέρηση είναι απογοητευτική και κάνει τους χρήστες να αντιλαμβάνονται ότι μια εφαρμογή είναι κατεστραμμένη).

5. Το Swift απαιτεί λιγότερο κωδικό

Το Swift μειώνει τον αριθμό του κώδικα που απαιτείται για επαναλαμβανόμενες δηλώσεις και χειρισμό συμβολοσειρών. Στο Objective-C, η εργασία με συμβολοσειρές κειμένου είναι πολύ λεπτομερής και απαιτεί πολλά βήματα για το συνδυασμό δύο πληροφοριών. Η Swift υιοθετεί σύγχρονες λειτουργίες γλώσσας προγραμματισμού όπως η προσθήκη δύο χορδών μαζί με έναν τελεστή "+", ο οποίος λείπει στο Objective-C. Η υποστήριξη για το συνδυασμό χαρακτήρων και συμβολοσειρών όπως αυτή είναι θεμελιώδης για οποιαδήποτε γλώσσα προγραμματισμού που εμφανίζει κείμενο σε έναν χρήστη σε μια οθόνη.

Το σύστημα τύπου στο Swift μειώνει την πολυπλοκότητα των δηλώσεων κώδικα - καθώς ο μεταγλωττιστής μπορεί να καταλάβει τύπους. Για παράδειγμα, το Objective-C απαιτεί από τους προγραμματιστές να απομνημονεύουν ειδικά διακριτικά συμβολοσειρών (%μικρό, %ρε, %@) και δώστε μια λίστα μεταβλητών διαχωρισμένων με κόμμα για να αντικαταστήσετε κάθε διακριτικό. Το Swift υποστηρίζει παρεμβολή συμβολοσειρών, η οποία εξαλείφει την ανάγκη απομνημόνευσης των διακριτικών και επιτρέπει στους προγραμματιστές να εισάγουν μεταβλητές απευθείας ενσωματωμένες σε μια συμβολοσειρά που βλέπει ο χρήστης, όπως μια ετικέτα ή ένας τίτλος κουμπιού. Το σύστημα συμπερασμάτων τύπου και η παρεμβολή συμβολοσειρών μετριάζουν μια κοινή πηγή σφαλμάτων που είναι κοινά στον Στόχο-Γ.

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

6. Το Swift είναι πιο γρήγορο

Η απόρριψη παλαιών συμβάσεων C βελτίωσε σημαντικά το Swift κάτω από την κουκούλα. Οι δείκτες αναφοράς για την απόδοση του κώδικα Swift συνεχίζουν να δείχνουν την αφοσίωση της Apple στη βελτίωση της ταχύτητας με την οποία το Swift μπορεί να εκτελεί λογική εφαρμογών.

Σύμφωνα με την Primate Labs, κατασκευαστές του δημοφιλούς εργαλείου επιδόσεων GeekBench, η Swift πλησίαζε τα χαρακτηριστικά απόδοσης του C ++ για εργασίες υπολογιστικής σύνδεσης τον Δεκέμβριο του 2014 χρησιμοποιώντας τον αλγόριθμο Mandelbrot.

Τον Φεβρουάριο του 2015, η Primate Labs ανακάλυψε ότι το Xcode 6.3 Beta βελτίωσε την απόδοση του αλγόριθμου GEMM του Swift - ενός αλγορίθμου συνδεδεμένου με μνήμη με διαδοχική πρόσβαση μεγάλων συστοιχιών - με συντελεστή 1,4. Η αρχική εφαρμογή FFT - ένας αλγόριθμος συνδεδεμένος στη μνήμη με τυχαία πρόσβαση μεγάλων συστοιχιών - είχε βελτίωση απόδοσης 2,6 φορές.

Περαιτέρω βελτιώσεις παρατηρήθηκαν στο Swift εφαρμόζοντας βέλτιστες πρακτικές, με αποτέλεσμα μια αύξηση 8,5 φορές για την απόδοση του αλγορίθμου FFT (αφήνοντας το C ++ με μόνο κέρδος απόδοσης 1,1 φορές). Οι βελτιώσεις επέτρεψαν επίσης στο Swift να ξεπεράσει το C ++ για τον αλγόριθμο Mandelbrot με συντελεστή μόλις 1,03.

Το Swift είναι σχεδόν ισοδύναμο με το C ++ και για τους αλγόριθμους FFT και Mandelbrot. Σύμφωνα με τα Primate Labs, η απόδοση του αλγορίθμου GEMM υποδηλώνει ότι ο μεταγλωττιστής Swift δεν μπορεί να διανύσει τον κώδικα του μετασχηματιστή C ++ - ένα εύκολο κέρδος απόδοσης που θα μπορούσε να επιτευχθεί στην επόμενη έκδοση του Swift.

7. Λιγότερες συγκρούσεις ονόματος με έργα ανοιχτού κώδικα

Ένα ζήτημα που μαστίζει τον κώδικα Objective-C είναι η έλλειψη επίσημης υποστήριξης για χώρους ονομάτων, η οποία ήταν η λύση του C ++ για τον κωδικό σύγκρουσης ονόματος αρχείου. Όταν συμβαίνει αυτή η σύγκρουση ονόματος στο Objective-C, πρόκειται για σφάλμα σύνδεσης και η εφαρμογή δεν μπορεί να εκτελεστεί. Υπάρχουν λύσεις, αλλά έχουν πιθανές παγίδες. Η κοινή σύμβαση είναι να χρησιμοποιήσετε προθέματα δύο ή τριών γραμμάτων για να διαφοροποιήσετε τον κώδικα Objective-C που γράφεται, ας πούμε, από το Facebook σε σχέση με τον δικό σας κωδικό.

Το Swift παρέχει σιωπηρούς χώρους ονομάτων που επιτρέπουν να υπάρχει το ίδιο αρχείο κώδικα σε πολλά έργα χωρίς να προκαλείται αποτυχία κατασκευής και να απαιτούνται ονόματα όπως το NSString (Next Step - εταιρεία Steve Jobs μετά την απομάκρυνσή του από την Apple) ή το CGPoint (Core Graphics). Τελικά, αυτή η λειτουργία στο Swift διατηρεί τους προγραμματιστές πιο παραγωγικούς και σημαίνει ότι δεν χρειάζεται να κάνουν τη λογιστική που υπάρχει στο Objective-C. Μπορείτε να δείτε την επιρροή του Swift με απλά ονόματα όπως Array, Dictionary και String αντί για NSArray, NSDictionary και NSString, τα οποία γεννήθηκαν λόγω της έλλειψης χώρων ονομάτων στο Objective-C.

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

8. Το Swift υποστηρίζει δυναμικές βιβλιοθήκες

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

Ο προγραμματιστής υποβάλλει την εφαρμογή μαζί με τις βιβλιοθήκες, και οι δύο είναι ψηφιακά υπογεγραμμένες με το πιστοποιητικό ανάπτυξης για να διασφαλιστεί η ακεραιότητα (γεια, NSA). Αυτό σημαίνει ότι το Swift μπορεί να εξελιχθεί γρηγορότερα από το iOS, κάτι που αποτελεί προϋπόθεση για μια σύγχρονη γλώσσα προγραμματισμού. Όλες οι αλλαγές στις βιβλιοθήκες μπορούν να περιληφθούν με την τελευταία ενημέρωση μιας εφαρμογής στο App Store και όλα λειτουργούν απλώς.

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

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