Η Swift παρέχει δύο βασικές κατηγορίες αριθμών: τους ακέραιους και τους αριθμούς κινητής υποδιαστολής.
0, 1, -1, 42 και -273.0.0, 3.14 και -1.36969e-10.Μπορείς να εισάγεις κάτω παύλες στα αριθμητικά λεκτικά για να βελτιώσεις την αναγνωσιμότητα: το 1_000_000 είναι ίδιο με το 1000000.
Τα λεκτικά κινητής υποδιαστολής μπορούν να γραφτούν σε δεκαδική ή εκθετική μορφή.
Στις περισσότερες περιπτώσεις, χρησιμοποιείς τον Int για τους ακέραιους και τον Double για τους αριθμούς κινητής υποδιαστολής:
let speed: Int = 42 // Explicit Int
let pi: Double = 3.14 // Explicit Double
let giga: Double = 1_000_000_000 // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34 // Double in scientific notation
Η Swift παρέχει τους τυπικούς αριθμητικούς τελεστές για αριθμητικούς υπολογισμούς:
| Τελεστής | Περιγραφή | Παράδειγμα |
|---|---|---|
+ |
Πρόσθεση | το 4 + 6 δίνει 10
|
- |
Αφαίρεση | το 15 - 10 δίνει 5
|
* |
Πολλαπλασιασμός | το 2 * 3 δίνει 6
|
Η Swift είναι ασφαλής ως προς τους τύπους και δεν επιτρέπει την ανάμιξη διαφορετικών αριθμητικών τύπων σε αριθμητικές πράξεις.
Δεν μπορείς να προσθέσεις ή να πολλαπλασιάσεις απευθείας ένα Int και ένα Double. Πρέπει πρώτα να μετατρέψεις τον έναν τύπο ώστε να ταιριάζει με τον άλλον.
Ο τελεστής / εκτελεί τη διαίρεση.
Όταν και οι δύο τελεστέοι είναι ακέραιοι, η ακέραια διαίρεση αποκόπτει τυχόν κλασματικό υπόλοιπο:
5.0 / 2.0 // 2.5 (Double division)
5 / 2 // 2 (integer division truncates the remainder)
Η διαίρεση ενός μη μηδενικού αριθμού κινητής υποδιαστολής με το μηδέν δίνει inf ή -inf.
Η διαίρεση του 0.0 με το 0.0 παράγει nan (όχι αριθμός).
Αντίθετα, η διαίρεση ενός ακέραιου με το μηδέν προκαλεί σφάλμα κατά τη μεταγλώττιση ή κατά την εκτέλεση:
print(5.0 / 0.0) // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0) // Prints nan
// The following line will not compile:
// print(5 / 0) // Error: Division by zero
Ο τελεστής υπολοίπου (%) υπολογίζει το υπόλοιπο που απομένει μετά τη διαίρεση δύο ακεραίων:
5 % 2 // 1
-5 % 2 // -1
// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
Στη Swift, το % είναι ένας γνήσιος τελεστής υπολοίπου και όχι τελεστής modulo.
Το αποτέλεσμα παίρνει πάντα το πρόσημο του πρώτου τελεστέου (του διαιρετέου), ανεξάρτητα από το πρόσημο του δεύτερου τελεστέου:
5 % -2 // 1
-5 % 2 // -1
Μπορείς να στρογγυλοποιήσεις έναν αριθμό κινητής υποδιαστολής χρησιμοποιώντας τη μέθοδο rounded().
Από προεπιλογή, η rounded() στρογγυλοποιεί στον πλησιέστερο ακέραιο.
Μπορείς επίσης να δώσεις έναν συγκεκριμένο κανόνα στρογγυλοποίησης, όπως .up ή .down:
let x = 3.14
let y = x.rounded() // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up) // 4.0
Όταν δηλώνεις μια αριθμητική σταθερά ή μεταβλητή χωρίς επισημείωση τύπου, η Swift συμπεραίνει τον τύπο της:
Int.Double.let x = 42 // Inferred as Int
let y = 42.0 // Inferred as Double
let z: Double = 42 // Explicitly typed as Double
Για να κάνεις πράξεις ανάμεσα σε τιμές διαφορετικών τύπων, μετέτρεψε τη μία τιμή χρησιμοποιώντας αρχικοποιητές τύπου όπως Double(_:) ή Int(_:):
let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0
let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)
Σε αυτή την άσκηση θα γράψεις κώδικα για να βοηθήσεις έναν freelancer να συνεννοηθεί με τους πελάτες του σχετικά με τις τιμές ορισμένων έργων. Θα γράψεις μερικές βοηθητικές συναρτήσεις για να υπολογίζεις γρήγορα το κόστος για τους πελάτες.
Ένας πελάτης επικοινωνεί με τον freelancer για να ρωτήσει για τις χρεώσεις του. Ο freelancer εξηγεί ότι δουλεύει 8 ώρες την ημέρα. Ωστόσο, ο freelancer γνωρίζει μόνο την ωριαία χρέωσή του για το έργο. Βοήθησέ τον να υπολογίσει μια ημερήσια χρέωση με δεδομένη την ωριαία χρέωση.
Υλοποίησε τη συνάρτηση dailyRateFrom(hourlyRate:), η οποία παίρνει το όρισμα hourlyRate που περιέχει την ωριαία χρέωση του freelancer.
Η συνάρτηση πρέπει να επιστρέφει την ημερήσια χρέωση με βάση την ωριαία χρέωση.
dailyRateFrom(hourlyRate: 60)
// Returns 480.0
Η ημερήσια χρέωση που επιστρέφεται πρέπει να είναι Double.
Μερικές φορές, ένας πελάτης ενδιαφέρεται να προσλάβει τον freelancer για μεγαλύτερο χρονικό διάστημα. Ο freelancer είναι πρόθυμος να κάνει έκπτωση στον πελάτη, αλλά μόνο αν ο πελάτης τον προσλάβει για τουλάχιστον έναν μήνα. Συνολικά υπάρχουν 22 εργάσιμες ημέρες. Βοήθησε τον freelancer να υπολογίσει τη μηνιαία χρέωσή του, με δεδομένες την ωριαία χρέωση και το ποσοστό έκπτωσης που είναι διατεθειμένος να εφαρμόσει στη σταθερή τιμή, στρογγυλοποιημένο στον πλησιέστερο ακέραιο αριθμό.
Υλοποίησε τη συνάρτηση monthlyRateFrom(hourlyRate:withDiscount:), η οποία παίρνει τα ορίσματα hourlyRate που περιέχει την ωριαία χρέωση του freelancer, και withDiscount που περιέχει την έκπτωση που είναι διατεθειμένος να δώσει ο freelancer στον πελάτη.
Η συνάρτηση πρέπει να επιστρέφει τη μηνιαία χρέωση στρογγυλοποιημένη στον πλησιέστερο ακέραιο αριθμό.
monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129
Μια άλλη μέρα, ένας υπεύθυνος έργου προτείνει στον freelancer να δουλέψει σε ένα έργο με σταθερό προϋπολογισμό. Με δεδομένο τον σταθερό προϋπολογισμό και την ωριαία χρέωση του freelancer, βοήθησέ τον να υπολογίσει πόσες ημέρες θα δουλέψει μέχρι να εξαντληθεί ο προϋπολογισμός. Λάβε υπόψη ότι σε αυτό το σενάριο ο freelancer είναι πάντα πρόθυμος να δώσει την έκπτωση, ανεξάρτητα από τον αριθμό των ημερών πρόσληψης. Το αποτέλεσμα πρέπει να είναι στρογγυλοποιημένο προς τα κάτω στον πλησιέστερο ακέραιο αριθμό.
Υλοποίησε τη συνάρτηση workdaysIn(budget:hourlyRate:withDiscount:), η οποία παίρνει τα ορίσματα:
budget που περιέχει τον προϋπολογισμό για το έργο.hourlyRate που περιέχει την ωριαία χρέωση του freelancer.withDiscount που περιέχει την έκπτωση που είναι διατεθειμένος να δώσει ο freelancer στον πελάτη.Η συνάρτηση πρέπει να επιστρέφει τον αριθμό των εργάσιμων ημερών που θα δουλέψει ο freelancer στο έργο, στρογγυλοποιημένο προς τα κάτω.
workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Swift με 35 έννοιες116 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.