Ενώ η Swift προσφέρει πλούσια λειτουργικότητα στην Τυπική Βιβλιοθήκη της, μπορείς να αποκτήσεις πρόσβαση σε πολλές επιπλέον δυνατότητες εισάγοντας εξωτερικές βιβλιοθήκες και frameworks. Αυτές οι μονάδες μπορεί να προέρχονται απευθείας από το έργο της Swift (όπως ο Swift Argument Parser), από frameworks της πλατφόρμας της Apple (όπως το Foundation και το Network Framework), ή από βιβλιοθήκες τρίτων ανοιχτού κώδικα (όπως το SwiftyBeaver).
Οι βασικές μονάδες, όπως το Foundation, μία από τις πιο ευρέως χρησιμοποιούμενες βιβλιοθήκες στη Swift, περιλαμβάνονται στην αλυσίδα εργαλείων της Swift. Οι βιβλιοθήκες τρίτων πρέπει να προστεθούν στη διαμόρφωση του έργου σου (για παράδειγμα, χρησιμοποιώντας τον Swift Package Manager) πριν μπορέσεις να τις εισαγάγεις.
Η εισαγωγή μονάδων γίνεται γράφοντας τη λέξη-κλειδί import ακολουθούμενη από το όνομα της μονάδας.
Έτσι, μπορείς να εισαγάγεις το Foundation προσθέτοντας τα παρακάτω στο πρόγραμμά σου.
import Foundation
Η εισαγωγή μιας μονάδας κάνει τους τύπους, τις μεθόδους και τις συναρτήσεις της διαθέσιμα στον κώδικά σου.
Για παράδειγμα, η εισαγωγή του Foundation επεκτείνει το String με χρήσιμες βοηθητικές μεθόδους, όπως η components(separatedBy:).
Κατά σύμβαση, οι εντολές import τοποθετούνται στην αρχή ενός αρχείου Swift, ώστε οι εξαρτήσεις να είναι αμέσως ορατές σε όποιον διαβάζει τον κώδικα.
Μπορείς να προσπελάσεις μεμονωμένους χαρακτήρες σε ένα String χρησιμοποιώντας τον ίδιο τρόπο πρόσβασης με θέση που χρησιμοποιείς και με τους πίνακες.
Ωστόσο, οι θέσεις που χρησιμοποιούνται για τις συμβολοσειρές δεν είναι ακέραιοι αριθμοί και δεν μπορείς να δουλέψεις απευθείας μαζί τους.
Αντ' αυτού, πρέπει να υπολογιστούν με βάση κάποια άλλη γνωστή θέση, όπως το startIndex, που δείχνει τη θέση του πρώτου χαρακτήρα σε μια μη κενή συμβολοσειρά, χρησιμοποιώντας τις μεθόδους που είναι διαθέσιμες στις βιβλιοθήκες String και NSString (όταν έχει εισαχθεί η μονάδα Foundation, οι συμβολοσειρές στη Swift έχουν πρόσβαση σε όλες τις ιδιότητες και τις μεθόδους της NSString).
Για παράδειγμα, δεδομένης της παρακάτω συμβολοσειράς:
let csv = "apple,pear,peach,orange,cherry,lime,goosberry"
Δεν μπορείς να γράψεις csv[21] για να πάρεις το "g" στο "orange"· αντ' αυτού, πρέπει να υπολογίσεις μια τιμή τύπου String.Index και να δώσεις αυτή τη θέση.
Σημείωσε ότι αυτές οι θέσεις δεν προορίζονται να είναι κατανοητές από τον άνθρωπο από μόνες τους.
Είναι αυτό που ονομάζεται αδιαφανείς θέσεις, καθώς οι άνθρωποι δεν χρειάζεται να ξέρουν τι υπάρχει μέσα τους.
let index = csv.index(csv.startIndex, offsetBy: 21)
csv[index]
// "g"
print(index)
// prints Index(_rawBits: 1376513)
Σημείωσε, ωστόσο, ότι αν το offset δεν είναι έγκυρη θέση, δηλαδή αν επιστρέφει τη θέση πριν από το startIndex ή μετά το endIndex, η λειτουργία θα πετάξει ένα σφάλμα, τερματίζοντας το πρόγραμμα.
Για να αποτρέψεις αυτό το πρόβλημα, μπορείς να ορίσεις μια οριακή θέση.
Αυτή επιστρέφει μια προαιρετική θέση και θα επιστρέψει nil για θέσεις που κατά τα άλλα είναι μη έγκυρες.
let tooFar = csv.index(csv.startIndex, offsetBy: 200)
// error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
let tooFarButSafe = csv.index(csv.startIndex, offsetBy: 200, limitedBy: csv.endIndex)
// nil
Επιπλέον, οι θέσεις δεν μπορούν να μοιράζονται μεταξύ συμβολοσειρών.
Για παράδειγμα, χρησιμοποιώντας τη θέση index του "g" στο "orange" που υπολογίστηκε παραπάνω για να δείξεις μέσα στη συμβολοσειρά fam = "This is my family: 👨👩👦👦, this is our dog: 🐶, this is our cat: 🐱!", δηλαδή fam[index], θα τερματίσει το πρόγραμμά σου.
Υπάρχουν πολλοί λόγοι για όλα αυτά, αλλά όλοι βασικά συνοψίζονται στο ότι "το Unicode είναι μπερδεμένο".
Γενικά μιλώντας, αν χρειάζεσαι τυχαία πρόσβαση σε μεμονωμένους χαρακτήρες, πιθανότατα θέλεις να χρησιμοποιήσεις κάποια άλλη δομή δεδομένων, όπως έναν Array<Character>.
Η Swift έχει τις μεθόδους first και last για να πάρεις τον πρώτο και τον τελευταίο χαρακτήρα μιας συμβολοσειράς.
Αυτές οι μέθοδοι επιστρέφουν έναν προαιρετικό χαρακτήρα, οπότε αν η συμβολοσειρά είναι κενή, θα επιστρέψουν nil.
let str = "Hello, world!"
print(str.first) // Prints Optional("H")
print(str.last) // Prints Optional("!")
Μπορείς επίσης να χρησιμοποιήσεις τις μεθόδους prefix και suffix για να πάρεις μια υποσυμβολοσειρά.
Αυτές οι μέθοδοι δέχονται έναν ακέραιο ως όρισμα και επιστρέφουν μια υποσυμβολοσειρά που περιέχει τους πρώτους ή τους τελευταίους n χαρακτήρες της συμβολοσειράς.
let str = "Hello, world!"
print(str.prefix(5)) // Prints "Hello"
print(str.suffix(6)) // Prints "world!"
Το να δουλεύεις με κείμενο είναι κάτι συνηθισμένο στον προγραμματισμό. Η Swift, μαζί με το framework Foundation, παρέχει πολλές βολικές μεθόδους και ιδιότητες για να επιθεωρείς, να μετασχηματίζεις και να χειρίζεσαι συμβολοσειρές.
components(separatedBy:)
Για να χωρίσεις μια συμβολοσειρά σε έναν πίνακα υποσυμβολοσειρών με βάση έναν διαχωριστικό, χρησιμοποίησε τη components(separatedBy:) (απαιτείται η εισαγωγή του Foundation):
import Foundation
let sentence = "Hello, world!"
let words = sentence.components(separatedBy: " ")
print(words) // Prints ["Hello,", "world!"]
hasPrefix(_:) και hasSuffix(_:)
Για να ελέγξεις αν μια συμβολοσειρά αρχίζει ή τελειώνει με μια συγκεκριμένη ακολουθία χαρακτήρων, χρησιμοποίησε τη hasPrefix(_:) και τη hasSuffix(_:):
let greeting = "Hello, world!"
print(greeting.hasPrefix("Hello")) // Prints true
print(greeting.hasSuffix("world!")) // Prints true
Μπορείς να αλλάξεις τα πεζά/κεφαλαία μιας συμβολοσειράς χρησιμοποιώντας αυτές τις τυπικές μεθόδους και ιδιότητες:
lowercased(): Επιστρέφει ένα αντίγραφο της συμβολοσειράς με πεζούς χαρακτήρες.uppercased(): Επιστρέφει ένα αντίγραφο της συμβολοσειράς με κεφαλαίους χαρακτήρες.capitalized: Επιστρέφει ένα αντίγραφο όπου το πρώτο γράμμα κάθε λέξης είναι κεφαλαίο (από το Foundation).let greeting = "hello, world!"
print(greeting.lowercased()) // Prints "hello, world!"
print(greeting.uppercased()) // Prints "HELLO, WORLD!"
print(greeting.capitalized) // Prints "Hello, World!"
replacingOccurrences(of:with:)
Για να αντικαταστήσεις όλες τις εμφανίσεις μιας υποσυμβολοσειράς-στόχου με μια άλλη συμβολοσειρά, χρησιμοποίησε τη replacingOccurrences(of:with:) (από το Foundation):
let greeting = "Hello, world!"
let updated = greeting.replacingOccurrences(of: "world", with: "Swift")
print(updated) // Prints "Hello, Swift!"
joined(separator:)
Η μέθοδος joined(separator:) ανήκει σε συλλογές συμβολοσειρών, όπως η [String].
Ενώνει τα στοιχεία μεταξύ τους σε μία μόνο συμβολοσειρά χρησιμοποιώντας έναν διαχωριστικό:
let words = ["Hello", "world"]
let sentence = words.joined(separator: ", ")
print(sentence) // Prints "Hello, world"
Ένα νέο κλαμπ ποίησης άνοιξε στην πόλη και σκέφτεσαι να το επισκεφτείς. Επειδή έχουν συμβεί περιστατικά στο παρελθόν, το κλαμπ έχει μια πολύ συγκεκριμένη πολιτική στην πόρτα, την οποία θα πρέπει να μάθεις καλά πριν επιχειρήσεις να μπεις.
Υπάρχουν δύο πόρτες στο κλαμπ ποίησης και οι δύο είναι φυλασσόμενες. Για να μπεις, θα πρέπει να βρεις τον κωδικό της ημέρας:
Το πρώτο πράγμα που πρέπει να κάνεις είναι να χωρίσεις το ποίημα σε ξεχωριστές γραμμές. Ο φρουρός θα απαγγείλει ένα ποίημα και εσύ θα πρέπει να το χωρίσεις σε γραμμές.
Υλοποίησε τη συνάρτηση splitOnNewlines που παίρνει μια συμβολοσειρά και τη χωρίζει σε έναν πίνακα συμβολοσειρών, χρησιμοποιώντας τον χαρακτήρα αλλαγής γραμμής ως διαχωριστικό.
Η συνάρτηση θα πρέπει να επιστρέφει έναν πίνακα συμβολοσειρών, όπου κάθε συμβολοσειρά είναι μια γραμμή του ποιήματος.
splitOnNewlines("Hello.\nHow are you?\n\nI'm doing fine.")
// returns ["Hello." ,"How are you?", "", "I'm doing fine"].
_ αντ' αυτού.Για παράδειγμα, ένας από τους αγαπημένους τους συγγραφείς είναι ο Michael Lockwood, ο οποίος έχει γράψει το παρακάτω ακροστιχικό ποίημα, που σημαίνει ότι το πρώτο γράμμα κάθε στίχου σχηματίζει μια λέξη:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Όταν ο φρουρός απαγγείλει το ποίημα, θα το χωρίσεις σε ξεχωριστές γραμμές και θα απαντήσεις με τα πρώτα γράμματα κάθε γραμμής, δηλαδή ["S", "H", "I", "R", "E"].
Στη συνέχεια, ο φρουρός θα σου δώσει τη λέξη που σχηματίζεται από τον πίνακα γραμμάτων με τον οποίο απάντησες, για να τη μετατρέψεις σε μορφή με κεφαλαίο πρώτο γράμμα.
Τελικά, ο κωδικός που θα επιστρέψεις είναι "SHIRE" και θα μπεις μέσα.
Υλοποίησε τη συνάρτηση frontDoorPassword που παίρνει μια συμβολοσειρά που αντιπροσωπεύει το ποίημα.
Η συνάρτηση θα πρέπει να επιστρέφει τον κωδικό που θα έδινες στον φρουρό.
frontDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "SHIRE"
Στο πίσω μέρος του κλαμπ θα βρεις τους πιο διάσημους ποιητές, κάτι σαν την περιοχή VIP. Επειδή αυτό δεν είναι για όλους, η διαδικασία της πίσω πόρτας είναι λίγο πιο περίπλοκη.
", please" στο τέλος της λέξης που σχηματίζουν τα γράμματα.Για παράδειγμα, το ποίημα που αναφέρθηκε προηγουμένως είναι επίσης τελεστιχικό, που σημαίνει ότι το τελευταίο γράμμα κάθε στίχου σχηματίζει μια λέξη:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Όταν ο φρουρός απαγγείλει το ποίημα, θα το χωρίσεις σε ξεχωριστές γραμμές, θα αφαιρέσεις τυχόν κενά στο τέλος και θα απαντήσεις με τα τελευταία γράμματα κάθε γραμμής, δηλαδή ["h", "o", "r", "s", "e"].
Στη συνέχεια, ο φρουρός θα σου δώσει τη λέξη που σχηματίζεται από τον πίνακα γραμμάτων με τον οποίο απάντησες, για να τη μετατρέψεις σε μορφή με κεφαλαίο πρώτο γράμμα και να προσθέσεις στο τέλος το ", please".
Τελικά, ο κωδικός που θα επιστρέψεις είναι "horse, please" και θα μπεις μέσα.
Υλοποίησε τη συνάρτηση backDoorPassword που παίρνει μια συμβολοσειρά που αντιπροσωπεύει το ποίημα.
Η συνάρτηση θα πρέπει να επιστρέφει τον κωδικό που θα έδινες στον φρουρό.
backDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "horse, please"
Μέσα στο πίσω δωμάτιο του κλαμπ υπάρχει άλλη μια πόρτα που οδηγεί στο μυστικό δωμάτιο, στο οποίο μπορούν να μπουν μόνο οι κορυφαίοι ποιητές.
"!" στο τέλος της λέξης που σχηματίζουν τα γράμματα.Για παράδειγμα, μια τροποποιημένη εκδοχή του ποιήματος που αναφέρθηκε προηγουμένως ταιριάζει με αυτό το μοτίβο:
Stands so high
Huge hooves too
Impatiently waits for
Rider with harness
Eager to leave
Όταν ο φρουρός απαγγείλει το ποίημα, θα το χωρίσεις σε ξεχωριστές γραμμές, θα αφαιρέσεις τυχόν κενά στο τέλος και θα απαντήσεις με τα ith γράμματα κάθε γραμμής, δηλαδή ["S", "u", "p", "e", "r"].
Στη συνέχεια, ο φρουρός θα σου δώσει τη λέξη που σχηματίζεται από τον πίνακα γραμμάτων με τον οποίο απάντησες, για να τη βάλεις σε μορφή με κεφαλαία γράμματα και να προσθέσεις στο τέλος το "!".
Τελικά, ο κωδικός που θα επιστρέψεις είναι SUPER! και θα μπεις μέσα.
Υλοποίησε τη συνάρτηση secretRoomPassword που παίρνει μια συμβολοσειρά που αντιπροσωπεύει το ποίημα.
Η συνάρτηση θα πρέπει να επιστρέφει τον κωδικό που θα έδινες στον φρουρό.
secretRoomPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nRider with harness\nEager to leave")
// returns "SUPER!"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Swift με 35 έννοιες116 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.