Swift中的设计模式:iOS/macOS开发者实用指南
设计模式(design patterns)是软件开发中经过验证的典型问题解决方案。对于iOS/macOS开发者来说,掌握Swift中的设计模式是一项必备技能,能够帮助创建可扩展、可测试且易于维护的应用程序。本文将结合真实代码示例,详细解析4种关键设计模式。
1. Singleton(单例模式)
这是iOS开发中最流行的设计模式之一。它确保一个类只有一个实例,并提供一个全局访问点。常用于管理共享资源:UserDefaults、NetworkManager、Database。
Swift中的Singleton实现
class NetworkManager { static let shared = NetworkManager() private init() { } func fetchData(from url: URL) { // 请求逻辑 print("数据已从 \\(url) 获取") }}
// 使用NetworkManager.shared.fetchData(from: URL(string: "https://api.example.com")!)重要提示:在Swift 5.5+中,使用actor实现线程安全:
actor SettingsManager { static let shared = SettingsManager() private var settings: [String: String] = [:] func setValue(_ value: String, forKey key: String) { settings[key] = value } func getValue(forKey key: String) -> String? { return settings[key] }}2. Factory Method(工厂方法模式)
定义创建对象的接口,但允许子类更改所创建对象的类型。非常适合创建不同类型的UI组件或数据模型。
示例:为不同平台创建按钮
protocol Button { func render()}
class iOSButton: Button { func render() { print("显示带圆角的iOS按钮") }}
class macOSButton: Button { func render() { print("显示带渐变效果的macOS按钮") }}
protocol ButtonFactory { func createButton() -> Button}
class iOSButtonFactory: ButtonFactory { func createButton() -> Button { return iOSButton() }}
class macOSButtonFactory: ButtonFactory { func createButton() -> Button { return macOSButton() }}
// 使用let factory: ButtonFactory = iOSButtonFactory()let button = factory.createButton()button.render() // "显示带圆角的iOS按钮"3. Observer(观察者模式)
允许对象订阅事件并接收变更通知。在Swift中通过NotificationCenter、Combine或didSet实现。
通过Combine实现(iOS 13+)
import Combine
class WeatherStation { @Published var temperature: Double = 0.0 func updateTemperature(_ temp: Double) { temperature = temp }}
class WeatherDisplay { var subscriptions = Set<AnyCancellable>() let station = WeatherStation() func startObserving() { station.$temperature .sink { [weak self] newTemp in print("温度已变化:\\(newTemp)°C") self?.updateUI(with: newTemp) } .store(in: &subscriptions) } private func updateUI(with temp: Double) { // 更新界面 }}通过协议实现经典方式
protocol Observer: AnyObject { func update(value: Int)}
class Subject { private var observers = [Observer]() func attach(_ observer: Observer) { observers.append(observer) } func detach(_ observer: Observer) { observers.removeAll { $0 === obs