الخلاصة
View Protocol هو البروتوكول المركزي لـ SwiftUI. يتطلب خاصية واحدة: var body: some View. body هي خاصية محسوبة تُرجع وصف الواجهة. يستدعي SwiftUI body عند كل تغيير في الحالة ويُصدر النتيجة على GPU.
@ViewBuilder هو Result Builder لـ Views. يسمح بكتابة عدة Views داخل إغلاق بدون 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 و.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+) — تنقل يعتمد على البيانات. يأخذ مسارًا (مصفوفة من القيم القابلة للهاش) ويعرض الوجهة عبر 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 — حالة محلية (value type). @Binding — اتصال بحالة الأصل. @StateObject — ينشئ ObservableObject. يدير SwiftUI دورة حياة الكائن. @ObservedObject — يراقب ObservableObject خارجيًا. @EnvironmentObject — كائن من البيئة (حقن التبعيات عبر .environmentObject()). @Environment — قيم النظام (.colorScheme و.locale). @AppStorage — UserDefaults. @FetchRequest — استعلام Core Data. @FocusState — تركيز الإدخال.
| المغلف | الغرض | الملكية |
|---|---|---|
| @State | حالة محلية (value type) | العرض يملك |
| @Binding | اتصال بحالة الأصل | الأصل يملك |
| @StateObject | إنشاء ObservableObject | العرض يملك |
| @ObservedObject | مراقبة كائن خارجي | مالك خارجي |
| @EnvironmentObject | كائن من البيئة | السلف يملك |
| @Environment | قيمة نظام | النظام |
| @AppStorage | UserDefaults | UserDefaults |
| @FocusState | تركيز الإدخال | العرض يملك |
@StateObject مقابل @ObservedObject: @StateObject ينشئ كائنًا، @ObservedObject يراقبه. استخدم @StateObject لإنشاء النموذج الأولي في التسلسل الهرمي، @ObservedObject للتمرير إلى العروض الفرعية. @FocusState — إدارة التركيز: .focused($field, equals: .email). يدعم enum لحقول متعددة.
@Environment — قيم النظام: colorScheme وlocale وsizeCategory وlayoutDirection وmanagedObjectContext. Custom Environment Values — قيمة مخصصة عبر EnvironmentKey. تستخدم لحقن التبعيات: تمرير الخدمات بدون معاملات صريحة. معدّل .environment() — تعيين قيمة في التسلسل الهرمي. @EnvironmentObject — ObservableObject من .environmentObject(). يختلف عن @Environment في أنه يمرر نوعًا مرجعيًا. توصي IT Sectr باستخدام @Environment للقيم النظامية و@EnvironmentObject للخدمات.
.task{} — عملية غير متزامنة عند ظهور العرض. إلغاء تلقائي عند الاختفاء. يحل محل .onAppear لـ async/await. .onAppear{} — عملية متزامنة عند الظهور. .onDisappear{} — عملية عند الاختفاء. .onChange(of:) — رد فعل على تغيير القيمة. .onReceive(Publisher) — رد فعل على ناشر Combine. دورة حياة العرض في 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 في ناشر objectWillChange. @Published — ينشر تغييرات الخاصية. @StateObject — ينشئ ObservableObject ويدير دورة الحياة. @ObservedObject — يراقب خارجيًا. Combine — إطار عمل للبرمجة التفاعلية. @EnvironmentObject — حقن التبعيات عبر البيئة. .environmentObject() يعيّن، @EnvironmentObject يقرأ. MVVM — بنية قياسية: View (SwiftUI) — ViewModel (ObservableObject) — Model. توصي IT Sectr باستخدام MVVM + @StateObject لـ ViewModels الرئيسية.
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 strict concurrency. نشر الحزم عبر GitHub بعلامة semver. SPM هو المعيار الفعلي لتبعيات 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 هو وصف الواجهة، يُعرض على GPU.
@ViewBuilder هو Result Builder لـ Views متعددة. يسمح بـ if/else وswitch وForEach داخل الحاويات.
@StateObject ينشئ كائنًا. @ObservedObject يراقب كائنًا موجودًا. @StateObject للإنشاء الأول في التسلسل الهرمي.
NavigationStack — تنقل يعتمد على البيانات. مسار-based، deep linking. يحل محل NavigationView.
@FocusState — إدارة تركيز الإدخال. معدّل .focused(). يدعم enum لحقول متعددة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.