Οι πίνακες είναι ένας από τους τρεις βασικούς τύπους συλλογών της Swift. Ένας πίνακας είναι μια διατεταγμένη λίστα στοιχείων. Οι πίνακες μπορούν να αποθηκεύουν στοιχεία οποιουδήποτε τύπου, αλλά όλα τα στοιχεία ενός δεδομένου πίνακα πρέπει να έχουν τον ίδιο τύπο. Ένας πίνακας μπορεί να τροποποιηθεί όταν ανατεθεί σε μια μεταβλητή, που σημαίνει ότι μπορείς να προσθέσεις, να αφαιρέσεις ή να τροποποιήσεις στοιχεία αφού δημιουργήσεις τον πίνακα. Όταν ανατεθεί σε μια σταθερά, ο πίνακας είναι αμετάβλητος, που σημαίνει ότι το περιεχόμενό του δεν μπορεί να αλλάξει.
Τα κυριολεκτικά πίνακα γράφονται ως μια λίστα στοιχείων χωρισμένων με κόμμα, μέσα σε αγκύλες ([...]).
Η Swift μπορεί να συμπεράνει τον τύπο του πίνακα από τα στοιχεία μέσα στο κυριολεκτικό.
let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]
Μπορείς επίσης να προσδιορίσεις τον τύπο ρητά.
Οι τύποι πίνακα μπορούν να γραφτούν με δύο τρόπους: Array<T> ή η συντομευμένη σύνταξη [T], όπου T είναι ο τύπος των τιμών που περιέχει ο πίνακας.
let evenInts: Array<Int> = [2, 4, 6, 8, 10, 12]
var oddInts: [Int] = [1, 3, 5, 7, 9, 11, 13]
let greetings: [String] = ["Hello!", "Hi!", "¡Hola!"]
Μπορείς να βρεις τον αριθμό των στοιχείων ενός πίνακα με την ιδιότητα count:
evenInts.count
// returns 6
Για να δημιουργήσεις έναν κενό πίνακα, πρέπει να προσδιορίσεις τον τύπο του. Μπορείς να το κάνεις αυτό με τη σύνταξη αρχικοποίησης πίνακα ή με ρητή δήλωση τύπου:
let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []
Οι πίνακες μπορούν να εμφωλευτούν για να δημιουργήσουν πολυδιάστατους πίνακες.
Όταν προσδιορίζεις ρητά τον τύπο ενός εμφωλευμένου πίνακα, περικλείεις τον τύπο των στοιχείων σε εμφωλευμένες αγκύλες, όπως [[Int]] ή Array<Array<Int>>:
let multiDimArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let multiDimArray2: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Μπορείς να προσθέσεις ένα στοιχείο στο τέλος ενός μεταβλητού πίνακα με τη μέθοδο append(_:):
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]
Μπορείς να εισάγεις ένα στοιχείο σε μια συγκεκριμένη θέση με τη μέθοδο insert(_:at:).
Αυτή η μέθοδος δέχεται δύο ορίσματα: το στοιχείο που θα εισαχθεί και τη θέση στην οποία θα εισαχθεί.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.insert(0, at: 0)
// oddInts is now [0, 1, 3, 5, 7, 9, 11, 13]
Μπορείς να συνδυάσεις δύο πίνακες σε έναν μόνο πίνακα με τον τελεστή +.
Ο τελεστής + δημιουργεί και επιστρέφει έναν νέο πίνακα. Δεν τροποποιεί τους αρχικούς πίνακες.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let combined = oddInts + [15, 17, 19]
// combined is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
print(oddInts)
// prints [1, 3, 5, 7, 9, 11, 13]
Μπορείς να προσπελάσεις ένα μεμονωμένο στοιχείο ενός πίνακα βάζοντας τη θέση του μέσα σε αγκύλες ([]) μετά το όνομα του πίνακα.
Οι θέσεις ενός πίνακα είναι τιμές Int με βάση το μηδέν, ξεκινώντας από το 0 για το πρώτο στοιχείο.
Η πρόσβαση σε θέση έξω από το έγκυρο εύρος προκαλεί σφάλμα κατά την εκτέλεση και το πρόγραμμα καταρρέει.
let evenInts = [2, 4, 6, 8, 10, 12]
let oddInts = [1, 3, 5, 7, 9, 11, 13]
evenInts[2]
// returns 6
oddInts[7]
// Fatal error: Index out of range
Μπορείς να αλλάξεις ένα στοιχείο σε έναν μεταβλητό πίνακα αναθέτοντας μια νέα τιμή σε μια συγκεκριμένη θέση. Όπως και με την ανάγνωση στοιχείων, η χρήση θέσης έξω από το έγκυρο εύρος προκαλεί σφάλμα κατά την εκτέλεση.
var evenInts = [2, 4, 6, 8, 10, 12]
evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]
Μπορείς να ενώσεις έναν πίνακα από συμβολοσειρές σε μία μόνο συμβολοσειρά με τη μέθοδο joined(separator:), η οποία δέχεται μια συμβολοσειρά διαχωριστικό:
let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"
Μπορείς να χωρίσεις μια συμβολοσειρά σε έναν πίνακα από υποσυμβολοσειρές με τη μέθοδο split(separator:), περνώντας τον χαρακτήρα διαχωρισμού:
let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]
Μπορείς να αφαιρέσεις ένα στοιχείο σε μια δεδομένη θέση με τη μέθοδο remove(at:).
Η θέση πρέπει να είναι μέσα στα έγκυρα όρια του πίνακα, αλλιώς προκαλείται σφάλμα κατά την εκτέλεση.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]
Για να αφαιρέσεις το τελευταίο στοιχείο ενός πίνακα, χρησιμοποίησε τη μέθοδο removeLast().
Η κλήση της removeLast() σε έναν κενό πίνακα προκαλεί σφάλμα κατά την εκτέλεση.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]
Ως μέλλουσα μάγισσα, η Elyse πρέπει να εξασκηθεί στα βασικά. Έχει μια στοίβα από κάρτες που θέλει να χειριστεί.
Για να κάνει τα πράγματα λίγο πιο εύκολα, χρησιμοποιεί μόνο τις κάρτες 1 έως 10, έτσι ώστε η στοίβα από κάρτες της να μπορεί να αναπαρασταθεί με έναν πίνακα αριθμών. Η θέση μιας συγκεκριμένης κάρτας αντιστοιχεί στη θέση μέσα στον πίνακα. Δηλαδή, η θέση 0 αναφέρεται στην πρώτη κάρτα, η θέση 1 στη δεύτερη κάρτα κ.ο.κ.
Όλες οι συναρτήσεις θα πρέπει να ενημερώνουν τον πίνακα με τις κάρτες και στη συνέχεια να επιστρέφουν τον τροποποιημένο πίνακα, ένας συνηθισμένος τρόπος εργασίας γνωστός ως μοτίβο Builder, που σου επιτρέπει να συνδέεις όμορφα τις συναρτήσεις μεταξύ τους.
Για να πάρεις μια κάρτα, επέστρεψε την κάρτα στη θέση position από τη δεδομένη στοίβα.
Υλοποίησε τη συνάρτηση getCard(at:from:) που παίρνει δύο ορίσματα: το at που είναι η θέση της κάρτας στη στοίβα, και το from που είναι η στοίβα με τις κάρτες.
Η συνάρτηση θα πρέπει να επιστρέφει την κάρτα στη θέση index από τη δεδομένη στοίβα.
let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4
Κάνε λίγη ταχυδακτυλουργία και αντάλλαξε την κάρτα στη θέση position με την κάρτα αντικατάστασης που δίνεται.
Υλοποίησε τη συνάρτηση setCard(at:in:to) που παίρνει τρία ορίσματα: το at που είναι η θέση της κάρτας στη στοίβα, το in που είναι η στοίβα με τις κάρτες, και το to που είναι η νέα κάρτα για να αντικαταστήσει την κάρτα στη θέση index.
Η συνάρτηση θα πρέπει να επιστρέφει ένα αντίγραφο της στοίβας με την κάρτα στη θέση index αντικατεστημένη με τη νέα κάρτα.
Αν το δοσμένο index δεν είναι έγκυρη θέση στη στοίβα, η αρχική στοίβα θα πρέπει να επιστραφεί, αμετάβλητη.
let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]
Κάνε μια κάρτα να εμφανιστεί εισάγοντας μια νέα κάρτα στην κορυφή της στοίβας.
Υλοποίησε τη συνάρτηση insert(_:atTopOf:) που παίρνει δύο ορίσματα: τη νέα κάρτα που θα εισαχθεί, και τη στοίβα με τις κάρτες.
Η συνάρτηση θα πρέπει να επιστρέφει ένα αντίγραφο της στοίβας με τη νέα κάρτα που δίνεται προστιθέμενη στην κορυφή της στοίβας.
let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]
Κάνε μια κάρτα να εξαφανιστεί αφαιρώντας την κάρτα στη δοσμένη θέση position από τη στοίβα.
Υλοποίησε τη συνάρτηση removeCard(at:from:) που παίρνει δύο ορίσματα: το at που είναι η θέση της κάρτας στη στοίβα, και το from που είναι η στοίβα με τις κάρτες.
Η συνάρτηση θα πρέπει να επιστρέφει ένα αντίγραφο της στοίβας με την κάρτα στη θέση index αφαιρεμένη.
Αν το δοσμένο index δεν είναι έγκυρη θέση στη στοίβα, η αρχική στοίβα θα πρέπει να επιστραφεί, αμετάβλητη.
let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]
Κάνε μια κάρτα να εμφανιστεί εισάγοντας μια νέα κάρτα στη δοσμένη θέση position μέσα στη στοίβα.
Υλοποίησε τη συνάρτηση insert(_:at:from:) που παίρνει τρία ορίσματα: τη νέα κάρτα που θα εισαχθεί, τη θέση στην οποία θα πρέπει να εισαχθεί η νέα κάρτα, και τη στοίβα με τις κάρτες.
Η συνάρτηση θα πρέπει να επιστρέφει ένα αντίγραφο της στοίβας με τη νέα κάρτα που δίνεται προστιθέμενη στη δοσμένη θέση.
Αν το δοσμένο index δεν είναι έγκυρη θέση στη στοίβα, η αρχική στοίβα θα πρέπει να επιστραφεί, αμετάβλητη.
let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]
Έλεγξε αν το μέγεθος της στοίβας είναι ίσο με stackSize ή όχι.
Υλοποίησε τη συνάρτηση checkSizeOfStack(_:_:) που παίρνει δύο ορίσματα: το stack που είναι η στοίβα με τις κάρτες, και το stackSize που είναι το μέγεθος της στοίβας.
Η συνάρτηση θα πρέπει να επιστρέφει true αν το μέγεθος της στοίβας είναι ίσο με stackSize και false διαφορετικά.
let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Swift με 35 έννοιες116 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.