SwiftUI στην ανάπτυξη κινητών: τι είναι, βασικές έννοιες και πώς λειτουργεί

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-02 Χρόνος ανάγνωσης: 10 λεπ
Το SwiftUI είναι το δηλωτικό πλαίσιο της Apple για τη δημιουργία διεπαφών σε όλες τις πλατφόρμες. Σύμφωνα με το Apple SwiftUI Docs (2025), το SwiftUI χρησιμοποιείται στο 70% των νέων εφαρμογών στο App Store. Η κατανόηση των βασικών εννοιών του SwiftUI — View Protocol, @ViewBuilder, NavigationStack — είναι το θεμέλιο της σύγχρονης ανάπτυξης iOS.

Βασικά σημεία

  • View Protocol — var body: some View. Κάθε View είναι μια δομή που συμμορφώνεται με το πρωτόκολλο View. body είναι η περιγραφή του UI.
  • @ViewBuilder — Result Builder για πολλαπλά Views σε κοντέινερ. if/else, switch, ForEach μέσα στο body.
  • NavigationStack (iOS 16+) — πλοήγηση βασισμένη σε δεδομένα. path-based, deep linking. Αντικαθιστά το NavigationView.
  • @StateObject — ιδιοκτησία αντικειμένου. @ObservedObject — παρατήρηση. @EnvironmentObject — περιβάλλον.
  • @FocusState — διαχείριση εστίασης. .task{}, .onAppear{} — κύκλος ζωής. PreviewProvider — προεπισκόπηση.

Βασικά (View Protocol, body, some View, @ViewBuilder)

View Protocol είναι το κεντρικό πρωτόκολλο του SwiftUI. Απαιτεί μία μόνο ιδιότητα: var body: some View. body είναι μια υπολογισμένη ιδιότητα που επιστρέφει την περιγραφή του UI. Το SwiftUI καλεί το body σε κάθε αλλαγή κατάστασης και αποδίδει το αποτέλεσμα στην GPU.

@ViewBuilder

@ViewBuilder είναι ένα Result Builder για Views. Επιτρέπει τη σύνταξη πολλαπλών Views μέσα σε ένα closure χωρίς return και χωρίς TupleView. Υποστηρίζει if/else, switch, ForEach. Όλα τα κοντέινερ (VStack, HStack, ZStack, Group) χρησιμοποιούν @ViewBuilder. Μια εναλλακτική είναι το Group { … } για ομαδοποίηση χωρίς διάταξη. some View είναι ένα Opaque Type. Ο μεταγλωττιστής γνωρίζει τον συγκεκριμένο τύπο View (Text, Button, VStack, κ.λπ.), αλλά τον επιστρέφει εξωτερικά ως some View. Αυτό επιτρέπει την αλλαγή του τύπου body χωρίς αλλαγή της υπογραφής. ViewModifier — τροποποιητής View: .font(), .padding(), .background(). Προσαρμοσμένος τροποποιητής μέσω ViewModifier protocol και .modifier().

swift
// Παράδειγμα View με @ViewBuilder και NavigationStack
struct ContentView: View {
    @State private var items = ["Item 1", "Item 2"]

    var body: some View {
        NavigationStack {
            List(items, id: .self) { item in
                NavigationLink(item) {
                    DetailView(item: item)
                }
            }
            .navigationTitle("Items")
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Add") {
                        items.append("New Item")
                    }
                }
            }
        }
    }
}

// DetailView με @StateObject
struct DetailView: View {
    let item: String
    @StateObject private var viewModel = DetailViewModel()

    var body: some View {
        Text(item)
            .task {
                await viewModel.loadDetails(for: item)
            }
    }
}

Τροποποιητές και κοντέινερ (ViewModifier, NavigationStack, List, Form)

NavigationStack (iOS 16+) — πλοήγηση βασισμένη σε δεδομένα. Λαμβάνει μια διαδρομή (πίνακας hashable τιμών) και εμφανίζει τον προορισμό μέσω navigationDestination. Αντικαθιστά το NavigationLink με προβολές προορισμού. NavigationLink — κουμπί για πλοήγηση στη στοίβα. List — κάθετη λίστα με ενότητες, σαρώσεις, διαγραφή και μεταφορά και απόθεση. Form — μια εξειδικευμένη List για ρυθμίσεις: ενότητες, επιλογείς, διακόπτες, πεδία κειμένου. Section — ομαδοποίηση σε List/Form με κεφαλίδα και υποσέλιδο. ViewModifier — προσαρμοσμένοι τροποποιητές για επαναχρησιμοποίηση στυλ. .modifier(CustomModifier()) — εφαρμογή.

List και Form λεπτομερώς

List στο SwiftUI είναι το ισοδύναμο του UITableView. Υποστηρίζει .onDelete, .onMove, .refreshable. SwipeActions — .swipeActions { Button("Διαγραφή", role: .destructive) { } }. Form — βελτιστοποιημένο για ρυθμίσεις: DatePicker, Toggle, Stepper, Picker. Section με header/footer — για ομαδοποίηση. OutlineGroup — ιεραρχικές λίστες (ισοδύναμο UITableView με ενότητες). DisclosureGroup — αναδιπλούμενη ενότητα με περιεχόμενο. Η IT Sectr συνιστά List για δεδομένα και Form για ρυθμίσεις.

PreviewProvider — πρωτόκολλο για προεπισκοπήσεις στο Xcode Canvas. Canvas — διαδραστική προεπισκόπηση SwiftUI (απαιτεί @main και Swift 5.9+). @ScaledMetric — προσαρμοστικό μέγεθος που κλιμακώνεται με το Dynamic Type.

Διαχείριση κατάστασης (@StateObject, @ObservedObject, @EnvironmentObject, @FocusState)

Property Wrappers είναι η βάση της διαχείρισης κατάστασης στο SwiftUI. @State — τοπική κατάσταση (τύπος τιμής). @Binding — σύνδεση με την κατάσταση γονέα. @StateObject — δημιουργεί ObservableObject. Το SwiftUI διαχειρίζεται τον κύκλο ζωής του αντικειμένου. @ObservedObject — παρατηρεί ένα εξωτερικό ObservableObject. @EnvironmentObject — αντικείμενο από το περιβάλλον (έγχυση εξαρτήσεων μέσω .environmentObject()). @Environment — τιμές συστήματος (.colorScheme, .locale). @AppStorage — UserDefaults. @FetchRequest — ερώτημα Core Data. @FocusState — εστίαση εισόδου.

Περιτύλιγμα Σκοπός Ιδιοκτησία
@StateΤοπική κατάσταση (τύπος τιμής)View κατέχει
@BindingΣύνδεση με κατάσταση γονέαΓονέας κατέχει
@StateObjectΔημιουργία ObservableObjectView κατέχει
@ObservedObjectΠαρατήρηση εξωτερικού αντικειμένουΕξωτερικός κάτοχος
@EnvironmentObjectΑντικείμενο από περιβάλλονΠρόγονος κατέχει
@EnvironmentΤιμή συστήματοςΣύστημα
@AppStorageUserDefaultsUserDefaults
@FocusStateΕστίαση εισόδουView κατέχει

@StateObject vs @ObservedObject: Το @StateObject δημιουργεί ένα αντικείμενο, το @ObservedObject το παρατηρεί. Χρησιμοποιήστε @StateObject για την αρχική δημιουργία μοντέλου στην ιεραρχία, @ObservedObject για μετάδοση σε θυγατρικές προβολές. @FocusState — διαχείριση εστίασης: .focused($field, equals: .email). Υποστηρίζει enum για πολλαπλά πεδία.

Τιμές περιβάλλοντος και DI

@Environment — τιμές συστήματος: colorScheme, locale, sizeCategory, layoutDirection, managedObjectContext. Προσαρμοσμένες τιμές περιβάλλοντος — προσαρμοσμένη τιμή μέσω EnvironmentKey. Χρησιμοποιείται για έγχυση εξαρτήσεων: μετάδοση υπηρεσιών χωρίς ρητές παραμέτρους. Τροποποιητής .environment() — ορίζει μια τιμή στην ιεραρχία. @EnvironmentObject — ObservableObject από .environmentObject(). Διαφέρει από το @Environment επειδή μεταδίδει τύπο αναφοράς. Η IT Sectr συνιστά @Environment για τιμές συστήματος και @EnvironmentObject για υπηρεσίες.

Κύκλος ζωής (.task, .onAppear, .onDisappear)

.task{} — ασύγχρονη λειτουργία κατά την εμφάνιση της προβολής. Αυτόματη ακύρωση κατά την εξαφάνιση. Αντικαθιστά το .onAppear για async/await. .onAppear{} — σύγχρονη λειτουργία κατά την εμφάνιση. .onDisappear{} — λειτουργία κατά την εξαφάνιση. .onChange(of:) — αντίδραση σε αλλαγές τιμής. .onReceive(Publisher) — αντίδραση σε publisher Combine. Κύκλος ζωής View στο SwiftUI: init → onAppear → body (απόδοση) → onDisappear. Σε αλλαγή κατάστασης: body → diff → εκ νέου απόδοση. Η IT Sectr συνιστά .task για ασύγχρονη φόρτωση και .onAppear για αναλυτικά στοιχεία.

Κινούμενα σχέδια στο SwiftUI

.animation() — τροποποιητής κινούμενων σχεδίων. .transition() — κινούμενα σχέδια εμφάνισης/εξαφάνισης. withAnimation — ρητή κινούμενη αλλαγή κατάστασης. matchedGeometryEffect — κινούμενα σχέδια μεταξύ διαφορετικών προβολών (hero animation). PhaseAnimator (iOS 17+) — πολυφασικά κινούμενα σχέδια βασισμένα σε enum. KeyframeAnimator (iOS 17+) — κινούμενα σχέδια καρέ-καρέ με keyframes. Τα κινούμενα σχέδια SwiftUI εκτελούνται στην GPU μέσω Core Animation. Η IT Sectr συνιστά .spring() για φυσικά κινούμενα σχέδια και .interpolatingSpring για φυσικά εφέ.

Ροή δεδομένων (Bindings, @Published, ObservableObject)

ObservableObject — πρωτόκολλο για αντικείμενα με ιδιότητες @Published. Το SwiftUI εγγράφεται στον publisher objectWillChange. @Published — δημοσιεύει αλλαγές ιδιότητας. @StateObject — δημιουργεί ObservableObject, διαχειρίζεται τον κύκλο ζωής. @ObservedObject — παρατηρεί εξωτερικό. Combine — πλαίσιο για αντιδραστικό προγραμματισμό. @EnvironmentObject — DI μέσω περιβάλλοντος. .environmentObject() ορίζει, @EnvironmentObject διαβάζει. MVVM — τυπική αρχιτεκτονική: View (SwiftUI) — ViewModel (ObservableObject) — Model. Η IT Sectr συνιστά MVVM + @StateObject για κύρια ViewModel.

swift
class UserViewModel: ObservableObject {
    @Published var users: [User] = []
    @Published var isLoading = false

    func loadUsers() async {
        isLoading = true
        defer { isLoading = false }
        do {
            users = try await api.fetchUsers()
        } catch {
            print("Σφάλμα: \(error)")
        }
    }
}

struct UsersView: View {
    @StateObject private var viewModel = UserViewModel()

    var body: some View {
        List(viewModel.users, id: \.id) { user in
            Text(user.name)
        }
        .task { await viewModel.loadUsers() }
        .overlay {
            if viewModel.isLoading { ProgressView() }
        }
    }
}

Προσβασιμότητα και εντοπισμός

Προσβασιμότητα στο SwiftUI: .accessibilityLabel(), .accessibilityHint(), .accessibilityValue(), .accessibilityAddTraits(). Το VoiceOver διαβάζει ετικέτες προσβασιμότητας. Dynamic Type — @ScaledMetric, @DynamicProperty. Εντοπισμός: String(localized:) (SwiftUI + String Catalog). LocalizedStringKey — αυτόματη μετάφραση. Κανόνες πληθυντικού — μέσω String Catalog (one, few, many, other). Από δεξιά προς αριστερά (αραβικά, εβραϊκά) — υποστηρίζεται αυτόματα. .environment(.layoutDirection, .rightToLeft). Η IT Sectr συνιστά ετικέτες προσβασιμότητας για όλα τα διαδραστικά στοιχεία.

swift
struct AccessibleButton: View {
    let action: () -> Void

    var body: some View {
        Button(action: action) {
            Label("Settings", systemImage: "gear")
        }
        .accessibilityLabel("Open Settings")
        .accessibilityHint("Double tap to navigate to settings screen")
        .accessibilityAddTraits(.isButton)
    }
}

// Υποστήριξη Dynamic Type
struct ScalableText: View {
    @ScaledMetric private var fontSize: CGFloat = 17

    var body: some View {
        Text("Hello, World!")
            .font(.system(size: fontSize))
    }
}

Γραφήματα και οπτικοποίηση (Swift Charts)

Swift Charts (iOS 16+) — πλαίσιο για δημιουργία γραφημάτων. Chart { } — βασικό κοντέινερ. BarMark, LineMark, PointMark, AreaMark, RuleMark — σημάδια. ForEach για δεδομένα. ChartAxis — προσαρμογή αξόνων. .chartXAxis, .chartYAxis. ChartLegend — υπόμνημα. Παρεμβολή — catmullRom, linear, step. Κινούμενα σχέδια — .animation() για Chart. Η IT Sectr συνιστά Swift Charts για ενσωματωμένα γραφήματα και Charts (DGCharts) για σύνθετα.

swift
import Charts

struct MonthlySales: Identifiable {
    let id = UUID()
    let month: String
    let sales: Double
}

struct SalesChart: View {
    let data: [MonthlySales]

    var body: some View {
        Chart(data) { item in
            BarMark(
                x: .value("Month", item.month),
                y: .value("Sales", item.sales)
            )
            .foregroundStyle(.blue.gradient)
        }
        .chartXAxisLabel("Month")
        .chartYAxisLabel("Sales")
        .frame(height: 200)
        .padding()
    }
}

Swift Package Manager (SPM) — ο διαχειριστής εξαρτήσεων της Apple. Ενσωματωμένος στο Xcode. Υποστηρίζει: δυαδικά πακέτα, πόρους, δοκιμές, swift-6 αυστηρή ταυτοχρονία. Δημοσίευση πακέτων μέσω GitHub με ετικέτα semver. Το SPM είναι το de facto πρότυπο για εξαρτήσεις Swift, αντικαθιστώντας τα CocoaPods και Carthage. Η IT Sectr συνιστά SPM για όλα τα νέα έργα.

Swift Concurrency (async/await, TaskGroup, AsyncSequence) — async/await ενσωματωμένο στο Swift 5.5+. Task — μονάδα ασύγχρονου. TaskGroup — παράλληλες εργασίες. AsyncSequence — ασύγχρονη ακολουθία (AsyncStream, AsyncAlgorithms). Task Local Values — συμφραζόμενα δεδομένα για Task. Η Swift Concurrency αντικαθιστά πλήρως το Combine για ασύγχρονες λειτουργίες.

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

Τι είναι το View Protocol στο SwiftUI;

View Protocol είναι το βασικό πρωτόκολλο. Απαιτεί var body: some View. body είναι η περιγραφή UI που αποδίδεται στην GPU.

Τι είναι το @ViewBuilder και γιατί χρειάζεται;

@ViewBuilder είναι ένα Result Builder για πολλαπλά Views. Επιτρέπει if/else, switch, ForEach μέσα σε κοντέινερ.

Ποια είναι η διαφορά μεταξύ @StateObject και @ObservedObject;

@StateObject δημιουργεί ένα αντικείμενο. Το @ObservedObject παρατηρεί ένα υπάρχον. @StateObject για πρώτη δημιουργία στην ιεραρχία.

Τι είναι το NavigationStack στο iOS 16+;

NavigationStack — πλοήγηση βασισμένη σε δεδομένα. path-based, deep linking. Αντικαθιστά το NavigationView.

Πώς λειτουργεί το @FocusState στο SwiftUI;

@FocusState — διαχείριση εστίασης εισόδου. Τροποποιητής .focused(). Υποστηρίζει enum για πολλαπλά πεδία.

Περίληψη

  • View Protocol — var body: some View. Θεμέλιο του SwiftUI. Κάθε View είναι μια struct.
  • @ViewBuilder — δηλωτική σύνταξη για πολλαπλά Views. if/else, ForEach μέσα στο body.
  • NavigationStack (iOS 16+) — σύγχρονη πλοήγηση. data-driven, path-based.
  • @StateObject — ιδιοκτησία μοντέλου. @ObservedObject — παρατήρηση. @EnvironmentObject — DI.
  • @FocusState — διαχείριση εστίασης. Χρήσιμο για φόρμες και πολλαπλά πεδία εισόδου.
  • .task{} — ασύγχρονη λειτουργία με αυτόματη ακύρωση. .onAppear{} — σύγχρονη.
  • PreviewProvider και Canvas — προεπισκοπήσεις στο Xcode. @ScaledMetric — προσαρμοστικά μεγέθη.

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

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

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