Swift: τι είναι, σύνταξη και βασικές έννοιες της γλώσσας

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-09 Χρόνος ανάγνωσης: 8 λεπ

Swift — μια σύγχρονη γλώσσα προγραμματισμού από την Apple, που παρουσιάστηκε στο WWDC 2014 ως αντικατάσταση της Objective-C. Η Swift συνδυάζει ασφαλή τυποποίηση, αυτόματη διαχείριση μνήμης ARC (Automatic Reference Counting) και προσέγγιση προσανατολισμένη σε πρωτόκολλα. Swift Programming Language — η κύρια πηγή για τη σύνταξη και την τυπική βιβλιοθήκη της γλώσσας.

Κύρια σημεία

  • Swift — στατικά τυποποιημένη γλώσσα με type inference, Optionals και Protocol-Oriented Programming
  • Optionals — ασφαλής εργασία με nil μέσω Optional Binding (if let) και Optional Chaining (?.)
  • ARC — αυτόματη μέτρηση αναφορών για διαχείριση μνήμης χωρίς χειροκίνητο retain/release
  • Closures — ανώνυμες συναρτήσεις με δέσμευση περιβάλλοντος, που χρησιμοποιούνται σε callback-API και λειτουργικές αλυσίδες
  • Struct vs Class — value-τύποι vs reference-τύποι με διαφορετική συμπεριφορά κατά την ανάθεση και κληρονομικότητα

Τι είναι η Swift;

Swift — μια γλώσσα προγραμματισμού πολλαπλών παραδειγμάτων που αναπτύχθηκε από την Apple για iOS, macOS, watchOS, tvOS και visionOS. Οι βασικοί στόχοι της γλώσσας: ασφάλεια, ταχύτητα και εκφραστικότητα σύνταξης. Η Swift χρησιμοποιεί τον μεταγλωττιστή LLVM και παράγει βελτιστοποιημένο κώδικα μηχανής, συγκρίσιμο σε απόδοση με τη C++.

Από την κυκλοφορία το 2014, η Swift έχει περάσει από 6 κύριες εκδόσεις. Η Swift 6 (2024) εισήγαγε ένα πλήρες μοντέλο data-race safety μέσω αυστηρού ελέγχου απομόνωσης ταυτόχρονου κώδικα. Σύμφωνα με το GitHub Octoverse 2025, η Swift βρίσκεται στις top-10 γλώσσες με βάση την ανάπτυξη της κοινότητας, ξεπερνώντας τη Rust και την Kotlin σε ρυθμό υιοθέτησης στις πλατφόρμες της Apple.

Η Swift είναι ανοιχτή και cross-platform — ο πηγαίος κώδικας δημοσιεύεται στο GitHub (Swift Open Source). Εκτός από τις πλατφόρμες της Apple, η Swift χρησιμοποιείται σε Linux και Windows για ανάπτυξη διακομιστή (Vapor, Hummingbird), αν και ο κύριος τομέας εφαρμογής παραμένει η ανάπτυξη εφαρμογών για κινητά και επιτραπέζιους υπολογιστές στο οικοσύστημα της Apple.

Γιατί η Swift αντικατέστησε την Objective-C

Βασικοί λόγοι μετάβασης: Η Swift εξαλείφει ολόκληρες κατηγορίες σφαλμάτων που είναι πιθανά στην Objective-C. Type safety αποτρέπει αναντιστοιχίες τύπων στο στάδιο μεταγλώττισης. Optionals αποκλείουν τις nil-αναφορές. ARC είναι ενσωματωμένο από την πρώτη μέρα, σε αντίθεση με το MRC/ARC στην Objective-C. Η σύνταξη της Swift είναι συντομότερη και πιο ευανάγνωστη — έρευνες δείχνουν μείωση του όγκου κώδικα κατά 30-40% σε σύγκριση με την Objective-C για παρόμοιες εργασίες.

Σύνταξη και βασικές δομές

Η βασική σύνταξη της Swift συνδυάζει γνωστές δομές παρόμοιες με C με στοιχεία λειτουργικών γλωσσών. Οι μεταβλητές δηλώνονται μέσω var, οι σταθερές μέσω let. Ο μεταγλωττιστής χρησιμοποιεί type inference, επομένως η ρητή δήλωση τύπου απαιτείται μόνο σε περίπτωση ασάφειας.

swift
import Foundation

// Σταθερές και μεταβλητές
let name = "Swift"
var version = 6.0
var count: Int = 42

// Συναρτήσεις με προεπιλεγμένες παραμέτρους
func greet(person: String, greeting: String = "Hello") -> String {
    return "\(greeting), \(person)!"
}

// Guard-let για πρώιμη έξοδο
func parse(input: String?) -> Int {
    guard let value = input, let number = Int(value) else {
        return 0
    }
    return number
}

Switch και pattern matching στη Swift είναι ισχυρότερα από ό,τι στη C και την Kotlin. Το Switch υποστηρίζει αντιστοίχιση με πλειάδες, εύρη, συνθήκες where και δέσμευση τιμών. Ο μεταγλωττιστής ελέγχει την εξαντλητική κάλυψη όλων των case — η απουσία default δεν αποτελεί σφάλμα εάν όλες οι πιθανές τιμές καλύπτονται.

swift
let point = (x: 3, y: -1)

switch point {
case (0, 0):
    print("Αρχή συντεταγμένων")
case let (x, y) where x == y:
    print("X ισούται με Y")
case let (x, y) where abs(y) > x:
    print("Το Y είναι μεγαλύτερο από το X modulo")
default:
    print("Σημείο (\(point.x), \(point.y))")
}

Optionals και ασφαλής εργασία με nil

Optionals — η κεντρική έννοια της Swift, που λύνει το πρόβλημα των null-αναφορών στο επίπεδο του συστήματος τύπων. Το Optional<Wrapped> είναι ένα enum με δύο case: .none (nil) και .some(Wrapped). Ο μεταγλωττιστής απαγορεύει τη χρήση Optional χωρίς ρητό έλεγχο, αποκλείοντας μια ολόκληρη κατηγορία σφαλμάτων εκτέλεσης.

swift
var optionalString: String? = "Hello"
optionalString = nil  // επιτρέπεται

// Optional Binding — ασφαλής εξαγωγή
if let text = optionalString {
    print("Κείμενο: \(text)")
} else {
    print("Τιμή απουσία")
}

// Optional Chaining — ασφαλής πρόσβαση σε ιδιότητες
let length = optionalString?.count ?? 0

// Τελεστής Nil-coalescing
let greeting = optionalString ?? "Default"

Optional Chaining με τον τελεστή ?. επιτρέπει την ασφαλή κλήση μεθόδων και πρόσβαση σε ιδιότητες μιας προαιρετικής τιμής. Εάν η αλυσίδα διακοπεί από nil, το αποτέλεσμα ολόκληρης της έκφρασης είναι nil. Nil-coalescing (??) παρέχει μια προεπιλεγμένη τιμή και χρησιμοποιείται ευρέως σε κώδικα UI για εμφάνιση placeholder κειμένου.

Πρωτόκολλα και επεκτάσεις

Protocols στη Swift ορίζουν μια σύμβαση — ένα σύνολο ιδιοτήτων και μεθόδων. Σε αντίθεση με τις διεπαφές Java, τα πρωτόκολλα της Swift μπορούν να έχουν προεπιλεγμένες υλοποιήσεις μέσω protocol extensions. Αυτή είναι η βάση του Protocol-Oriented Programming, της προτεινόμενης από την Apple προσέγγισης αντί της κληρονομικότητας κλάσεων.

swift
protocol NamedEntity {
    var name: String { get }
    func description() -> String
}

// Προεπιλεγμένη υλοποίηση μέσω extension
extension NamedEntity {
    func description() -> String {
        return "Entity: \(name)"
    }
}

// Συμμόρφωση μέσω extension
extension String: NamedEntity {
    var name: String { return self }
}

Protocol Extensions επιτρέπουν την προσθήκη μεθόδων σε ένα πρωτόκολλο χωρίς τροποποίηση κάθε συμμορφούμενου τύπου. Αυτό είναι ιδιαίτερα χρήσιμο για την προσθήκη κοινών βοηθητικών λειτουργιών: map, filter, reduce για Sequence, ή Codable για σειριοποίηση JSON. Η Apple έχει χτίσει πολλά πλαίσια (SwiftUI, Combine) πάνω σε πρωτόκολλα με επεκτάσεις.

Closures και λειτουργικές αλυσίδες

Closures στη Swift — ανώνυμες συναρτήσεις που δεσμεύουν μεταβλητές από το εξωτερικό περιβάλλον. Συντακτικά, τα closures μοιάζουν με lambdas στην Kotlin, αλλά με πιο ευέλικτη σύνταξη: trailing closure, shorthand argument names ($0, $1) και autoclosures.

swift
// Closure με δέσμευση περιβάλλοντος
let numbers = [5, 3, 8, 1, 9]

// Trailing closure syntax
let sorted = numbers.sorted { $0 < $1 }

// Λειτουργική αλυσίδα
let result = numbers
    .filter { $0 > 3 }
    .map { $0 * 2 }
    .reduce(0, +)

// Closure ως παράμετρος συνάρτησης
func performAsync(completion: @escaping (Result<Data, Error>) -> Void) { }

@escaping closures χρησιμοποιούνται όταν το closure εκτελείται μετά την επιστροφή από τη συνάρτηση — τυπικά για αιτήματα δικτύου και ασύγχρονες λειτουργίες. @autoclosure τυλίγει αυτόματα μια έκφραση σε closure, που χρησιμοποιείται σε assert και λογική short-circuit.

Δομές και κλάσεις: σύγκριση

Η επιλογή μεταξύ struct και class — μία από τις πρώτες αποφάσεις κατά τον σχεδιασμό ενός μοντέλου Swift. Η Apple συνιστά τη χρήση struct από προεπιλογή (value-τύπος) και τη μετάβαση σε class (reference-τύπος) μόνο όταν απαιτείται κληρονομικότητα ή ταυτοποίηση μέσω αναφοράς.

ΧαρακτηριστικόStructClass
Τρόπος μεταφοράςΜε τιμή (αντίγραφο)Με αναφορά
ΚληρονομικότηταΔεν υποστηρίζεταιΥποστηρίζεται
Διαχείριση ARCΔεν απαιτείταιARC (μετρητής αναφορών)
Αποαρχικοποιητής deinitΌχιΝαι
Μεταβλητότηταmutating func για αλλαγή ιδιοτήτωνΟποιαδήποτε μέθοδος μπορεί να αλλάξει
Αποθήκευση σε συλλογέςΑντιγράφεται κατά την εισαγωγήΑποθηκεύεται η αναφορά

Value-τύποι (struct) είναι ασφαλέστεροι σε πολυνηματικό περιβάλλον — κάθε νήμα λαμβάνει ανεξάρτητο αντίγραφο. Reference-τύποι (class) είναι απαραίτητοι για εργασία με UIKit (UIView, UIViewController), όπου απαιτείται ταυτότητα αναφοράς και κληρονομικότητα από κλάσεις συστήματος.

Διαχείριση μνήμης ARC

ARC (Automatic Reference Counting) — το σύστημα διαχείρισης μνήμης της Swift για reference-τύπους. Ο μεταγλωττιστής εισάγει retain/release κατά την εκτέλεση, παρακολουθώντας τον αριθμό ισχυρών αναφορών σε ένα αντικείμενο. Όταν ο μετρητής φτάσει στο μηδέν, το αντικείμενο απελευθερώνεται αμέσως.

Το κύριο πρόβλημα του ARC — retain cycles (κυκλικές αναφορές). Όταν δύο αντικείμενα κρατούν ισχυρές αναφορές το ένα στο άλλο, η μνήμη δεν απελευθερώνεται. Λύση — weak αναφορές (γίνονται αυτόματα nil κατά την απελευθέρωση) και unowned αναφορές (εγγυώνται ότι το αντικείμενο ζει).

swift
class ProfileViewController: UIViewController {
    var onLogout: (() -> Void)?
    
    func setupHandler() {
        // [weak self] αποτρέπει το retain cycle
        onLogout = { [weak self] in
            guard let self else { return }
            self.dismiss(animated: true)
        }
    }
}

Για την πρόληψη retain cycles σε closures, χρησιμοποιήστε [weak self] με guard let self = self else { return }. Αυτός ο κανόνας είναι ιδιαίτερα σημαντικός στο UIKit, όπου το ViewController κρατά ισχυρές αναφορές στις ιδιότητές του και τα closures εντός αυτών των ιδιοτήτων αναφέρονται στο ViewController.

Συχνές Ερωτήσεις

Ποιοι τύποι δεδομένων υπάρχουν στη Swift;

Η Swift υποστηρίζει Int, Double, Float, String, Bool, Array, Set, Dictionary και πλειάδες (tuples). Αριθμητικοί τύποι έχουν σταθερό μέγεθος: Int8, Int16, Int32, Int64 και χωρίς πρόσημο UInt. Για εργασία με ημερομηνίες χρησιμοποιείται Date από το Foundation, για δεδομένα — Data.

Τι είναι το Optional στη Swift και γιατί χρειάζεται;

Optional — ένα enum με δύο case: .none (nil) και .some(Wrapped). Η Swift απαιτεί ρητό έλεγχο του Optional μέσω if let, guard let ή ??, αποκλείοντας το NullPointerException. Οι προαιρετικές αλυσίδες (?.) επιτρέπουν ασφαλή πρόσβαση σε ιδιότητες ένθετων προαιρετικών τιμών.

Πώς διαφέρει το struct από το class στη Swift;

Struct — value-τύπος, αντιγράφεται κατά την ανάθεση, δεν υποστηρίζει κληρονομικότητα, δεν απαιτεί ARC. Class — reference-τύπος, μεταφέρεται μέσω αναφοράς, υποστηρίζει κληρονομικότητα και αποαρχικοποιητές. Η Apple συνιστά το struct ως προεπιλεγμένο τύπο.

Πώς λειτουργεί η διαχείριση μνήμης ARC στη Swift;

Το ARC μετρά αυτόματα ισχυρές αναφορές σε αντικείμενα κλάσεων. Όταν ο μετρητής πέσει στο μηδέν, η μνήμη απελευθερώνεται. Για την πρόληψη κυκλικών αναφορών, χρησιμοποιήστε weak (αυτόματο nil) και unowned (εγγυημένη διάρκεια ζωής). Το ARC δεν εφαρμόζεται σε struct και enum.

Τι είναι το Protocol Oriented Programming στη Swift;

Protocol-Oriented Programming — μια προσέγγιση που χρησιμοποιεί πρωτόκολλα με επεκτάσεις αντί για ιεραρχία κλάσεων. Τα πρωτόκολλα μπορούν να περιέχουν προεπιλεγμένες υλοποιήσεις μεθόδων μέσω protocol extensions. Αυτό επιτρέπει την επαναχρησιμοποίηση κώδικα χωρίς κληρονομικότητα, διατηρώντας την ευελιξία και τη δυνατότητα δοκιμών.

Σύνοψη

  • Swift — στατικά τυποποιημένη γλώσσα της Apple με Optionals, ARC και Protocol-Oriented Programming για ανάπτυξη iOS/macOS
  • Optionals — ασφαλής εργασία με nil μέσω Optional Binding, Optional Chaining και nil-coalescing τελεστή
  • Protocols + Extensions — βάση του Protocol-Oriented Programming με προεπιλεγμένες υλοποιήσεις μεθόδων και σύνθεση
  • Closures — ανώνυμες συναρτήσεις με δέσμευση περιβάλλοντος, trailing syntax και λίστες δέσμευσης για διαχείριση μνήμης
  • Struct vs Class — value-τύποι (αντιγραφή, ασφάλεια νημάτων) έναντι reference-τύπων (κληρονομικότητα, ARC)
  • ARC — αυτόματη μέτρηση αναφορών με weak/unowned τροποποιητές για πρόληψη retain cycles
  • Switch και pattern matching — εξαντλητική κάλυψη, αντιστοίχιση με πλειάδες, εύρη και συνθήκες where

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης