أنماط التصميم في Swift: المستوى المتقدم مع أمثلة لتطبيقات iOS/macOS
\n\nأنماط التصميم هي حلول مثبتة للمشكلات النمطية في التطوير. بالنسبة لمطوري Swift الذين يعملون على تطبيقات iOS وmacOS، فإن إتقان الأنماط المتقدمة أمر بالغ الأهمية لإنشاء مشاريع قابلة للتوسع والاختبار والصيانة. في هذه المقالة، سنحلل أربعة أنماط رئيسية: MVVM، Coordinator، Builder و Factory. كل منها يحل مشكلات معمارية محددة ويستخدم بنشاط في التطوير التجاري.
\n\n1. نمط MVVM (Model-View-ViewModel) في Swift
\n\nMVVM هو أحد أشهر الأنماط المعمارية لـ SwiftUI وUIKit. يوفر فصلًا واضحًا بين منطق العرض ومنطق الأعمال، مما يبسط اختبار الكود وإعادة استخدامه.
\n\nمكونات MVVM:
\n- \n
- Model — البيانات ومنطق الأعمال (طلبات الشبكة، العمل مع قاعدة البيانات). \n
- View — واجهة المستخدم (SwiftUI View أو UIViewController). \n
- ViewModel — الوسيط الذي يعد البيانات لـ View ويعالج إجراءات المستخدم. \n
مثال على التنفيذ باستخدام SwiftUI:
\n\nimport SwiftUI\nimport Combine\n\n// MARK: - Model\nstruct User: Codable {\n let id: Int\n let name: String\n let email: String\n}\n\n// MARK: - ViewModel\nclass UserViewModel: ObservableObject {\n @Published var users: [User] = []\n @Published var isLoading = false\n private var cancellables = Set<AnyCancellable>()\n \n func fetchUsers() {\n isLoading = true\n guard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else { return }\n \n URLSession.shared.dataTaskPublisher(for: url)\n .map { $0.data }\n .decode(type: [User].self, decoder: JSONDecoder())\n .receive(on: DispatchQueue.main)\n .sink(receiveCompletion: { [weak self] completion in\n self?.isLoading = false\n if case .failure(let error) = completion {\n print("Error: \\(error)")\n }\n }, receiveValue: { [weak self] users in\n self?.users = users\n })\n .store(in: &cancellables)\n }\n}\n\n// MARK: - View\nstruct UserListView: View {\n @StateObject private var viewModel = UserViewModel()\n \n var body: some View {\n NavigationView {\n List(viewModel.users, id: \\.id) { user in\n VStack(alignment: .leading) {\n Text(user.name).font(.headline)\n Text(user.email).font(.subheadline).foregroundColor(.secondary)\n }\n }\n .navigationTitle("Users")\n .overlay {\n if viewModel.isLoading {\n ProgressView()\n }\n }\n }\n .onAppear {\n viewModel.fetchUsers()\n }\n }\n}\n\nمزايا MVVM:
\n- \n
- فصل واضح للمسؤوليات. \n
- سهولة اختبار ViewModel بدون واجهة المستخدم. \n
- تحديث تفاعلي لواجهة المستخدم عبر Combine أو @Published. \n
2. نمط Coordinator (المنسق) للتنقل
\n\nيحل Coordinator مشكلة "وحدات التحكم في العرض الضخمة" عن طريق نقل منطق التنقل إلى كائنات منفصلة. وهذا يبسط إعادة استخدام الشاشات ويجعل التنقل مرنًا.
\n\nالهيكل:
\n- \n
- AppCoordinator — المنسق الرئيسي الذي يدير المنسقين الفرعيين. \n
- ChildCoordinator — مسؤول عن تدفق معين (مثل المصادقة أو الشاشة الرئيسية). \n
مثال على التنفيذ لـ UIKit:
\n\nimport UIKit\n\n// MARK: - Coordinator Protocol\nprotocol Coord