Η δοκιμή της μονάδας μου απέτυχε. Ήθελε ένα nil αλλά πήρε <nil>. Η αρχική μου αντίδραση ήταν να κατηγορήσω τον υπολογιστή μου ότι ήταν χαζός. Περιμένεις διαφορετικό τύπο nil από εμένα; Υπάρχει μόνο ένα nil και το όνομά του είναι nil.

Υπομονή όμως. Οι υπολογιστές δεν είναι αρκετά εξελιγμένοι για να μας κοροϊδεύουν. Τι εκανα λαθος?

Το πρόβλημα του λεξικού

Είναι στάνταρ στο Swift να ξετυλίξετε ένα προαιρετικό με if let. Γιατί έλαβα ένα nil στη γραμμή 3;

Υπάρχει μια ένδειξη στη γραμμή 8. Όταν ορίζω ρητά το first σε nil, η λειτουργία ξετυλίγματος συμπεριφέρεται όπως αναμένεται. Πρέπει πραγματικά να υπάρχει ένα διαφορετικό είδος nil εδώ.

Πώς το Λεξικό ανακτά τις αξίες

Το Dictionary αναδιπλώνει την τιμή σε ένα προαιρετικό πριν σας το παραδώσει.

Όλα αυτά είναι καλά και αναμενόμενα. Το πρόβλημά μου εμφανίστηκε επειδή όριζα τον τύπο τιμής μου ως Any? αντί για Any. Το Swift τύλιξε διπλά την αξία μου!

Ρύθμιση ενός κλειδιού στο μηδέν

Όταν ορίζετε ένα κλειδί σε nil σε ένα Λεξικό, αφαιρεί αυτό το ζεύγος κλειδιού/τιμής για εσάς. Γι' αυτό η γραμμή 8 παραπάνω συμπεριφέρεται όπως αναμένεται.

Εάν θέλετε να ορίσετε ρητά την τιμή σας σε nil σε ένα Λεξικό με προαιρετικό τύπο τιμής, πρέπει πρώτα να το τυλίξετε μόνοι σας.

Η Swift έκανε αυτό το επιπλέον βήμα αυτόματα όταν δημιούργησα για πρώτη φορά το λεξικό μου με var dict: [String: Any?] = ["first", nil] — μου τύλιξε αυτό το μηδέν στα παρασκήνια.

Μην το κάνετε αυτό!

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

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

Ο Sean κρίνει πώς φαίνεται ο κώδικας στο Livefront.