Swift设计模式及iOS代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐