أنماط التصميم في Swift: المستوى المتقدم لتطبيقات iOS/macOS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أنماط التصميم في Swift: المستوى المتقدم مع أمثلة لتطبيقات iOS/macOS

\n\n

أنماط التصميم هي حلول مثبتة للمشكلات النمطية في التطوير. بالنسبة لمطوري Swift الذين يعملون على تطبيقات iOS وmacOS، فإن إتقان الأنماط المتقدمة أمر بالغ الأهمية لإنشاء مشاريع قابلة للتوسع والاختبار والصيانة. في هذه المقالة، سنحلل أربعة أنماط رئيسية: MVVM، Coordinator، Builder و Factory. كل منها يحل مشكلات معمارية محددة ويستخدم بنشاط في التطوير التجاري.

\n\n

1. نمط MVVM (Model-View-ViewModel) في Swift

\n\n

MVVM هو أحد أشهر الأنماط المعمارية لـ SwiftUI وUIKit. يوفر فصلًا واضحًا بين منطق العرض ومنطق الأعمال، مما يبسط اختبار الكود وإعادة استخدامه.

\n\n

مكونات MVVM:

\n
    \n
  • Model — البيانات ومنطق الأعمال (طلبات الشبكة، العمل مع قاعدة البيانات).
  • \n
  • View — واجهة المستخدم (SwiftUI View أو UIViewController).
  • \n
  • ViewModel — الوسيط الذي يعد البيانات لـ View ويعالج إجراءات المستخدم.
  • \n
\n\n

مثال على التنفيذ باستخدام SwiftUI:

\n\n
import 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
\n\n

2. نمط Coordinator (المنسق) للتنقل

\n\n

يحل Coordinator مشكلة "وحدات التحكم في العرض الضخمة" عن طريق نقل منطق التنقل إلى كائنات منفصلة. وهذا يبسط إعادة استخدام الشاشات ويجعل التنقل مرنًا.

\n\n

الهيكل:

\n
    \n
  • AppCoordinator — المنسق الرئيسي الذي يدير المنسقين الفرعيين.
  • \n
  • ChildCoordinator — مسؤول عن تدفق معين (مثل المصادقة أو الشاشة الرئيسية).
  • \n
\n\n

مثال على التنفيذ لـ UIKit:

\n\n
import UIKit\n\n// MARK: - Coordinator Protocol\nprotocol Coord                

المدونات

توصيات الكتب