Swift 101 - Εργασία με τις νέες προαιρετικές τιμές του Swift

Η γλώσσα προγραμματισμού Swift διαθέτει μια νέα δυνατότητα που ονομάζεται προαιρετικά που δεν ήταν προηγουμένως διαθέσιμη στο Στόχο-C. Είναι παρόμοια με τους προαιρετικούς τύπους Java και Nullable τύπους στη γλώσσα προγραμματισμού C #.

Γιατί να χρησιμοποιήσετε προαιρετικά;

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

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

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

Σχήμα 1 - Μπορείτε να καθορίσετε ότι ένα χαρακτηριστικό οντότητας Core Data είναι προαιρετικό.

Τώρα το Swift σας επιτρέπει να κάνετε το ίδιο με τις ιδιότητες και τις μεταβλητές σας. Ακολουθεί μια ισοδύναμη προαιρετική δήλωση στο Swift:

var middleName: String?

Αυτή η δήλωση δημιουργεί μια μεταβλητή με όνομα middleName τύπου String . Το ερωτηματικό ( ? ) Μετά τον τύπο μεταβλητής String υποδηλώνει ότι η μεταβλητή middleName μπορεί να περιέχει μια τιμή που μπορεί να είναι είτε μια συμβολοσειρά είτε μηδέν . Όποιος κοιτάζει αυτόν τον κώδικα ξέρει αμέσως ότι το μεσαίο όνομα μπορεί να είναι μηδέν . Είναι αυτο-τεκμηρίωση!

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

var middleName: String? = nil

Τώρα, θα εξετάσουμε προσεχώς πώς χρησιμοποιείται το μηδέν στο Swift.

nil στο Swift

Μπορεί να μην είναι προφανές με την πρώτη ματιά, αλλά μόνο τα προαιρετικά μπορεί να είναι μηδενικά . Όπως αναφέρεται στο βιβλίο The Swift Programming Language της Apple (διαθέσιμο δωρεάν στο iBooks Store):

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

Αυτό σημαίνει ότι δεν μπορείτε να κάνετε κάτι τέτοιο, επειδή η μεταβλητή firstName δεν επισημαίνεται με ερωτηματικό που υποδεικνύει ότι είναι προαιρετική:

var firstName: String = nil

Αυτός ο κώδικας παράγει το ακόλουθο σφάλμα χρόνου συλλογής:

Ο τύπος 'String' δεν συμμορφώνεται με το πρωτόκολλο 'NilLiteralConvertible' .

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

Πρόσβαση σε προαιρετικές τιμές

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

var firstName: String = "Ryan"

var middleName: String; = "Michael"

var firstAndMiddleNames: String

firstAndMiddleNames = firstName + "" + middleName

Οι πρώτες τρεις γραμμές του κώδικα δηλώνουν μια μεταβλητή String πρώτης ονομασίας, μια προαιρετική μεταβλητή String middleName και μια μεταβλητή FirstAndMiddleNames String. Η επόμενη γραμμή κώδικα συνενώνει (συνδέει) τις μεταβλητές τιμές firstName και middleName μαζί με ένα κενό μεταξύ τους. Μπορεί να εκπλαγείτε να διαπιστώσετε ότι αυτή η γραμμή κώδικα δημιουργεί το ακόλουθο σφάλμα χρόνου μεταγλώττισης:

Τιμή του τύπου επιλογής 'String?' όχι τυλιγμένο. εννοούσατε να χρησιμοποιείτε '!' ή '?'?

Αυτός είναι ένας από τους μηχανισμούς προστασίας της Swift. Σας αναγκάζει να αναγνωρίσετε ότι μια τιμή μπορεί να είναι μηδενική . Έτσι, πώς ανοίγετε ένα προαιρετικό; Υπάρχουν δύο κύριοι τρόποι όπως περιγράφονται στις επόμενες ενότητες.

Χρησιμοποιώντας την εξαναγκασμένη εκτύλιξη για προαιρετικά

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

firstAndMiddleNames = firstName + " " + middleName!

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

Χρησιμοποιώντας την προαιρετική βιβλιοδεσία για να ξετυλίξετε προαιρετικά

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

var firstName: String = "Ryan"

var middleName: String; = "Michael"

var firstAndMiddleNames: String

αν αφήσουμε middle = middleName

{

firstAndMiddleNames = firstName + "" + μέση

}}

αλλού

{

firstAndMiddleNames = firstName

}}

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

Εάν η μεταβλητή middleName περιέχει μηδέν, η κατάσταση αξιολογείται ως ψευδής, η προαιρετική τιμή δεν είναι τυλιγμένη και ο κώδικας στα σγουρά άκρα της εντολής else εκτελείται.

Εμφανώς ανασυσταθέντα προαιρετικά

Το Swift έχει επίσης κάτι που ονομάζεται σιωπηρά προαιρετικά. Αυτά είναι προαιρετικά που δεν χρειάζεται να ανασυσταθούν χρησιμοποιώντας αναγκαστική αναδίπλωση (!) Ή προαιρετική σύνδεση, επειδή αυτοί είναι τυλιγμένοι αυτομάτως. Δηλώνονται με θαυμαστικό (!) Και όχι με ερωτηματικό (?).

Συχνά βλέπετε προαιρετικά μη αποκλεισμένα προαιρετικά όταν εργάζεστε με τις διεπαφές του Builder Interface (ιδιότητες IBOutlet ). Για παράδειγμα:

@IBOutlet weak var lblDescription: UILabel!

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

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

Προφανώς, σε περιπτώσεις όπου δεν είστε 100% βέβαιοι ότι μια σταθερά ή μια μεταβλητή περιέχει μια τιμή, θα πρέπει να χρησιμοποιήσετε ένα κανονικό προαιρετικό αντί.

συμπέρασμα

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