class UserViewModel {
@Published var users: [User] = []
private var cancellables = Set<AnyCancellable>()
func fetchUsers() {
NetworkService.fetchUsers()
.sink(receiveCompletion: { _ in },
receiveValue: { [weak self] in self?.users = $0 })
.store(in: &cancellables)
}
}
protocol Coordinator {
var childCoordinators: [Coordinator] { get set }
func start()
}
class AppCoordinator: Coordinator {
var childCoordinators = [Coordinator]()
private let window: UIWindow
init(window: UIWindow) {
self.window = window
}
func start() {
let mainCoordinator = MainCoordinator(window: window)
childCoordinators.append(mainCoordinator)
mainCoordinator.start()
}
}
protocol UserRepositoryProtocol {
func getUsers() -> AnyPublisher<[User], Error>
}
class UserRepository: UserRepositoryProtocol {
private let remoteDataSource: UserRemoteDataSource
private let localDataSource: UserLocalDataSource
init(remote: UserRemoteDataSource, local: UserLocalDataSource) {
self.remoteDataSource = remote
self.localDataSource = local
}
func getUsers() -> AnyPublisher<[User], Error> {
return remoteDataSource.fetchUsers()
.catch { _ in self.localDataSource.fetchUsers() }
.eraseToAnyPublisher()
}
}
class DataService {
private let networkService: NetworkServiceProtocol
private let cacheService: CacheServiceProtocol
init(networkService: NetworkServiceProtocol,
cacheService: CacheServiceProtocol) {
self.networkService = networkService
self.cacheService = cacheService
}
}
protocol DataFetcher {
func fetchData() -> Data
}
class LoggingDataFetcher: DataFetcher {
private let wrapped: DataFetcher
init(wrapped: DataFetcher) {
self.wrapped = wrapped
}
func fetchData() -> Data {
print("Fetching data at \(Date())")
return wrapped.fetchData()
}
}
Singleton:
Factory:
protocol CellFactory {
func createCell(for model: ItemModel, tableView: UITableView) -> UITableViewCell
}
Observer:
Strategy:
Adapter:
Комбинация паттернов:
Функциональные подходы:
Реактивное программирование (Combine/RxSwift):
Основные паттерны, которые я реально применял в iOS разработке:
Архитектурные:
Порождающие:
Структурные:
Поведенческие:
Ключевой принцип: паттерны — это инструменты, а не догма. В современных iOS проектах я предпочитаю комбинацию MVVM + Coordinator + Repository с реактивным подходом (Combine), так как это дает хороший баланс между тестируемостью, поддерживаемостью и производительностью разработки.