Βασικά σημεία
View Protocol είναι το κεντρικό πρωτόκολλο του SwiftUI. Απαιτεί μία μόνο ιδιότητα: var body: some View. body είναι μια υπολογισμένη ιδιότητα που επιστρέφει την περιγραφή του UI. Το SwiftUI καλεί το body σε κάθε αλλαγή κατάστασης και αποδίδει το αποτέλεσμα στην GPU.
@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().
// Παράδειγμα 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)
}
}
}NavigationStack (iOS 16+) — πλοήγηση βασισμένη σε δεδομένα. Λαμβάνει μια διαδρομή (πίνακας hashable τιμών) και εμφανίζει τον προορισμό μέσω navigationDestination. Αντικαθιστά το NavigationLink με προβολές προορισμού. NavigationLink — κουμπί για πλοήγηση στη στοίβα. List — κάθετη λίστα με ενότητες, σαρώσεις, διαγραφή και μεταφορά και απόθεση. Form — μια εξειδικευμένη List για ρυθμίσεις: ενότητες, επιλογείς, διακόπτες, πεδία κειμένου. Section — ομαδοποίηση σε List/Form με κεφαλίδα και υποσέλιδο. ViewModifier — προσαρμοσμένοι τροποποιητές για επαναχρησιμοποίηση στυλ. .modifier(CustomModifier()) — εφαρμογή.
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.
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 | Δημιουργία ObservableObject | View κατέχει |
| @ObservedObject | Παρατήρηση εξωτερικού αντικειμένου | Εξωτερικός κάτοχος |
| @EnvironmentObject | Αντικείμενο από περιβάλλον | Πρόγονος κατέχει |
| @Environment | Τιμή συστήματος | Σύστημα |
| @AppStorage | UserDefaults | UserDefaults |
| @FocusState | Εστίαση εισόδου | View κατέχει |
@StateObject vs @ObservedObject: Το @StateObject δημιουργεί ένα αντικείμενο, το @ObservedObject το παρατηρεί. Χρησιμοποιήστε @StateObject για την αρχική δημιουργία μοντέλου στην ιεραρχία, @ObservedObject για μετάδοση σε θυγατρικές προβολές. @FocusState — διαχείριση εστίασης: .focused($field, equals: .email). Υποστηρίζει enum για πολλαπλά πεδία.
@Environment — τιμές συστήματος: colorScheme, locale, sizeCategory, layoutDirection, managedObjectContext. Προσαρμοσμένες τιμές περιβάλλοντος — προσαρμοσμένη τιμή μέσω EnvironmentKey. Χρησιμοποιείται για έγχυση εξαρτήσεων: μετάδοση υπηρεσιών χωρίς ρητές παραμέτρους. Τροποποιητής .environment() — ορίζει μια τιμή στην ιεραρχία. @EnvironmentObject — ObservableObject από .environmentObject(). Διαφέρει από το @Environment επειδή μεταδίδει τύπο αναφοράς. Η IT Sectr συνιστά @Environment για τιμές συστήματος και @EnvironmentObject για υπηρεσίες.
.task{} — ασύγχρονη λειτουργία κατά την εμφάνιση της προβολής. Αυτόματη ακύρωση κατά την εξαφάνιση. Αντικαθιστά το .onAppear για async/await. .onAppear{} — σύγχρονη λειτουργία κατά την εμφάνιση. .onDisappear{} — λειτουργία κατά την εξαφάνιση. .onChange(of:) — αντίδραση σε αλλαγές τιμής. .onReceive(Publisher) — αντίδραση σε publisher Combine. Κύκλος ζωής View στο SwiftUI: init → onAppear → body (απόδοση) → onDisappear. Σε αλλαγή κατάστασης: body → diff → εκ νέου απόδοση. Η IT Sectr συνιστά .task για ασύγχρονη φόρτωση και .onAppear για αναλυτικά στοιχεία.
.animation() — τροποποιητής κινούμενων σχεδίων. .transition() — κινούμενα σχέδια εμφάνισης/εξαφάνισης. withAnimation — ρητή κινούμενη αλλαγή κατάστασης. matchedGeometryEffect — κινούμενα σχέδια μεταξύ διαφορετικών προβολών (hero animation). PhaseAnimator (iOS 17+) — πολυφασικά κινούμενα σχέδια βασισμένα σε enum. KeyframeAnimator (iOS 17+) — κινούμενα σχέδια καρέ-καρέ με keyframes. Τα κινούμενα σχέδια SwiftUI εκτελούνται στην GPU μέσω Core Animation. Η IT Sectr συνιστά .spring() για φυσικά κινούμενα σχέδια και .interpolatingSpring για φυσικά εφέ.
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.
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 συνιστά ετικέτες προσβασιμότητας για όλα τα διαδραστικά στοιχεία.
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 (iOS 16+) — πλαίσιο για δημιουργία γραφημάτων. Chart { } — βασικό κοντέινερ. BarMark, LineMark, PointMark, AreaMark, RuleMark — σημάδια. ForEach για δεδομένα. ChartAxis — προσαρμογή αξόνων. .chartXAxis, .chartYAxis. ChartLegend — υπόμνημα. Παρεμβολή — catmullRom, linear, step. Κινούμενα σχέδια — .animation() για Chart. Η IT Sectr συνιστά Swift Charts για ενσωματωμένα γραφήματα και Charts (DGCharts) για σύνθετα.
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 είναι το βασικό πρωτόκολλο. Απαιτεί var body: some View. body είναι η περιγραφή UI που αποδίδεται στην GPU.
@ViewBuilder είναι ένα Result Builder για πολλαπλά Views. Επιτρέπει if/else, switch, ForEach μέσα σε κοντέινερ.
@StateObject δημιουργεί ένα αντικείμενο. Το @ObservedObject παρατηρεί ένα υπάρχον. @StateObject για πρώτη δημιουργία στην ιεραρχία.
NavigationStack — πλοήγηση βασισμένη σε δεδομένα. path-based, deep linking. Αντικαθιστά το NavigationView.
@FocusState — διαχείριση εστίασης εισόδου. Τροποποιητής .focused(). Υποστηρίζει enum για πολλαπλά πεδία.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.