ios客户端学习笔记(三):学习Swift的设计模式
设计模式是指在软件开发中常用的一些解决问题的方法和思想,它可以帮助你更好地组织代码和提高代码的可维护性。你需要学习常见的设计模式,如MVC、MVVM、单例模式、工厂模式等,在开发应用程序时应用它们。
当你学习常见的设计模式时,可以参考以下设计模式的定义和具体实例:
1. MVC模式(Model-View-Controller)
MVC模式是一种常用的设计模式,它将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理数据和业务逻辑,视图负责显示数据和用户交互,控制器负责协调模型和视图之间的交互。
MVC(Model-View-Controller)模式示例代码:
// Model
class User {var name: Stringvar age: Intinit(name: String, age: Int) {self.name = nameself.age = age}
}// View
class UserView {func displayUser(user: User) {print("Name: \(user.name), Age: \(user.age)")}
}// Controller
class UserController {let user: Userlet userView: UserViewinit(user: User, userView: UserView) {self.user = userself.userView = userView}func updateUser(name: String, age: Int) {user.name = nameuser.age = ageuserView.displayUser(user: user)}
}// Usage
let user = User(name: "John", age: 30)
let userView = UserView()
let userController = UserController(user: user, userView: userView)userController.updateUser(name: "Jane", age: 25)
具体实例:在iOS开发中,你可以使用MVC模式来构建应用程序的数据模型和逻辑结构。比如,在一个简单的计算器应用程序中,你可以使用MVC模式将计算逻辑放在模型中,将显示逻辑放在视图中,将用户交互放在控制器中。
以下是一个简单的计算器应用程序的MVC模式代码示例:
// Model
class Calculator {var result: Double = 0func add(number1: Double, number2: Double) {result = number1 + number2}func subtract(number1: Double, number2: Double) {result = number1 - number2}func multiply(number1: Double, number2: Double) {result = number1 * number2}func divide(number1: Double, number2: Double) {if number2 != 0 {result = number1 / number2} else {result = 0}}
}// View
class CalculatorView {func displayResult(result: Double) {print("Result: \(result)")}
}// Controller
class CalculatorController {let calculator: Calculatorlet calculatorView: CalculatorViewinit(calculator: Calculator, calculatorView: CalculatorView) {self.calculator = calculatorself.calculatorView = calculatorView}func add(number1: Double, number2: Double) {calculator.add(number1: number1, number2: number2)calculatorView.displayResult(result: calculator.result)}func subtract(number1: Double, number2: Double) {calculator.subtract(number1: number1, number2: number2)calculatorView.displayResult(result: calculator.result)}func multiply(number1: Double, number2: Double) {calculator.multiply(number1: number1, number2: number2)calculatorView.displayResult(result: calculator.result)}func divide(number1: Double, number2: Double) {calculator.divide(number1: number1, number2: number2)calculatorView.displayResult(result: calculator.result)}
}// Usage
let calculator = Calculator()
let calculatorView = CalculatorView()
let calculatorController = CalculatorController(calculator: calculator, calculatorView: calculatorView)calculatorController.add(number1: 10, number2: 5) // Output: Result: 15.0
calculatorController.subtract(number1: 10, number2: 5) // Output: Result: 5.0
calculatorController.multiply(number1: 10, number2: 5) // Output: Result: 50.0
calculatorController.divide(number1: 10, number2: 0) // Output: Result: 0.0
2. MVVM模式(Model-View-ViewModel)
MVVM模式是一种基于MVC模式的设计模式,它将视图和模型之间的交互通过ViewModel来实现,解耦了视图和模型之间的依赖关系。ViewModel负责处理视图和模型之间的交互,将模型转换为视图可以使用的数据格式。
MVVM(Model-View-ViewModel)模式示例代码:
// Model
class User {var name: Stringvar age: Intinit(name: String, age: Int) {self.name = nameself.age = age}
}// View
class UserView {var viewModel: UserViewModelfunc displayUser() {print("Name: \(viewModel.name), Age: \(viewModel.age)")}
}// ViewModel
class UserViewModel {var user: Uservar name: String {return user.name}var age: Int {return user.age}init(user: User) {self.user = user}func updateUser(name: String, age: Int) {user.name = nameuser.age = age}
}// Usage
let user = User(name: "John", age: 30)
let userViewModel = UserViewModel(user: user)
let userView = UserView(viewModel: userViewModel)userViewModel.updateUser(name: "Jane", age: 25)
userView.displayUser()
具体实例:在iOS开发中,你可以使用MVVM模式来构建应用程序的数据模型和逻辑结构。比如,在一个简单的天气应用程序中,你可以使用MVVM模式将天气数据放在模型中,将天气显示逻辑放在视图中,将天气数据的转换逻辑放在ViewModel中。
以下是一个简单的天气应用程序的MVVM模式代码示例:
// Model
struct Weather {let temperature: Doublelet description: String
}// View
class WeatherView {var weatherViewModel: WeatherViewModel? {didSet {updateUI()}}func updateUI() {guard let viewModel = weatherViewModel else {return}print("Temperature: \(viewModel.temperature)°C")print("Description: \(viewModel.description)")}
}// ViewModel
class WeatherViewModel {let weather: Weathervar temperature: String {return String(format: "%.1f", weather.temperature)}var description: String {return weather.description}init(weather: Weather) {self.weather = weather}
}// Usage
let weather = Weather(temperature: 27.5, description: "Sunny")
let weatherViewModel = WeatherViewModel(weather: weather)
let weatherView = WeatherView()weatherView.weatherViewModel = weatherViewModel // Output: Temperature: 27.5°C, Description: Sunny
3. 单例模式(Singleton)
单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供全局访问点。单例模式可以避免多个实例之间的冲突和资源浪费。
单例模式示例代码:
class Singleton {static let shared = Singleton()private init() {}func doSomething() {print("Doing something")}
}// Usage
Singleton.shared.doSomething()
具体实例:在iOS开发中,你可以使用单例模式来管理应用程序的全局状态和资源。比如,你可以使用单例模式来管理应用程序的网络连接、数据库连接等全局资源。
以下是一个使用单例模式来管理应用程序的网络连接的完整代码实例:
// NetworkManager Singleton
class NetworkManager {static let shared = NetworkManager()private init() {// Initialize network manager}func makeRequest(url: String, completion: @escaping (Data?, Error?) -> Void) {guard let url = URL(string: url) else {completion(nil, NSError(domain: "Invalid URL", code: 0, userInfo: nil))return}let task = URLSession.shared.dataTask(with: url) { (data, response, error) incompletion(data, error)}task.resume()}
}// Usage
NetworkManager.shared.makeRequest(url: "https://example.com") { (data, error) inif let error = error {print("Error: \(error.localizedDescription)")return}guard let data = data else {print("Error: No data received")return}let responseString = String(data: data, encoding: .utf8)print("Response: \(responseString ?? "")")
}
在这个例子中,我们创建了一个NetworkManager单例类,它有一个makeRequest方法,用于发起网络请求,并在请求完成后调用回调函数。我们在makeRequest方法中使用了URLSession来发起网络请求。我们可以通过调用NetworkManager.shared来获取NetworkManager单例的实例,并使用makeRequest方法来发起网络请求。
4. 工厂模式(Factory)
工厂模式是一种常用的设计模式,它将对象的创建和使用分离开来,通过一个工厂类来创建对象。工厂模式可以避免对象的创建和使用之间的耦合,提高代码的可维护性和可扩展性。
具体实例:在iOS开发中,你可以使用工厂模式来创建和管理应用程序中的对象。比如,你可以使用工厂模式来创建和管理应用程序的数据访问对象、网络请求对象等。
工厂模式示例代码:
// Product
protocol Animal {func makeSound()
}// Concrete Products
class Dog: Animal {func makeSound() {print("Woof!")}
}class Cat: Animal {func makeSound() {print("Meow!")}
}// Factory
class AnimalFactory {func createAnimal(type: String) -> Animal? {switch type {case "dog":return Dog()case "cat":return Cat()default:return nil}}
}// Usage
let animalFactory = AnimalFactory()if let dog = animalFactory.createAnimal(type: "dog") {dog.makeSound()
}if let cat = animalFactory.createAnimal(type: "cat") {cat.makeSound()
}
具体实例:在iOS开发中,你可以使用工厂模式来创建和管理应用程序中的对象。比如,你可以使用工厂模式来创建和管理应用程序的数据访问对象、网络请求对象等。
以下是一个使用工厂模式来创建和管理应用程序的数据访问对象的完整代码示例:
// DataAccessFactory Protocol
protocol DataAccessFactory {func createDataAccess() -> DataAccess
}// DataAccess Protocol
protocol DataAccess {func getData() -> [String: Any]?func saveData(data: [String: Any])
}// CoreDataAccess Factory
class CoreDataAccessFactory: DataAccessFactory {func createDataAccess() -> DataAccess {return CoreDataAccess()}
}// CoreDataAccess Class
class CoreDataAccess: DataAccess {func getData() -> [String: Any]? {// Fetch data from Core Data// ...return nil}func saveData(data: [String: Any]) {// Save data to Core Data// ...}
}// Usage
let dataAccessFactory: DataAccessFactory = CoreDataAccessFactory()
let dataAccess = dataAccessFactory.createDataAccess()
let data = dataAccess.getData()
dataAccess.saveData(data: ["key": "value"])
在这个例子中,我们定义了一个DataAccessFactory协议和一个DataAccess协议,分别用于定义数据访问对象的工厂和接口。然后,我们实现了一个CoreDataAccessFactory工厂类,用于创建CoreDataAccess数据访问对象。CoreDataAccess实现了DataAccess接口,它可以从Core Data中获取数据并将数据保存到Core Data中。我们可以通过调用CoreDataAccessFactory的createDataAccess方法来获取CoreDataAccess对象的实例,并使用getData和saveData方法来获取和保存数据。这种方式可以使我们在不改变业务逻辑的情况下,轻松地更改数据访问对象的实现方式。
相关文章:
ios客户端学习笔记(三):学习Swift的设计模式
设计模式是指在软件开发中常用的一些解决问题的方法和思想,它可以帮助你更好地组织代码和提高代码的可维护性。你需要学习常见的设计模式,如MVC、MVVM、单例模式、工厂模式等,在开发应用程序时应用它们。 当你学习常见的设计模式时ÿ…...
406. 根据身高重建队列
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 peopl…...
ESP32使用ESP-NOW协议实现一对多通信和MAC地址存储
目录 介绍ESP-NOW 协议概述在 ESP32 上配置 ESP-NOW使用 ESP-NOW 进行一对多通信在 ESP32 上存储发件人的 MAC 地址代码结论 介绍 ESP32 是一款功能强大的 Wi-Fi 和蓝牙双模模块,可用于使用 ESP-NOW 协议实现低功耗、高效率的一对多通信。本文将介绍如何使用ESP-NO…...
Qt 学生信息数据库管理
1 添加样式表 我们采用了样式表 通过添加Qt resources文件 添加前缀 添加文件,将我们的图标进行添加 2 拖动部件 用到的部件 Label 标签Pushbutton 按钮table view 视图LineEdit 输入框 3 程序编写 1 配置sql环境 在 pro文件中 添加 连接数据库跟访问数据…...
相量的加减乘除计算
相量的加减乘除计算 矢量是物理学中的术语,是指具有大小(magnitude)和方向的量。如速度、加速度、力等等就是这样的量。向量是数学中的术语,也称为欧几里得向量、几何向量、矢量。与向量对应的量叫做数量,在物理学中称…...
JavaScript 代码整洁之道
文章目录 概述篇变量篇函数篇注释篇异常处理篇复杂判断函数篇重构篇代码风格常量大写先声明后调用注释 参考资料 概述篇 书写能让人读懂的代码使用英语编写代码团队协作 制定通用的规则,依靠工具让团队的代码风格保持统一,要让代码看起来是由一个人编写…...
socket 及 字节序转换(嵌入式学习)
socket 及 字节序转换 socket简介Socket为什么需要Socket?socket类型Socket通信模型 字节序主机字节序到网络字节序网络字节序到主机字节序IP地址转换 socket简介 1、1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口 2、1…...
Java之~ Aop自定义注解日志
大纲步骤: 一,创建需要记录的日志表,创建基础方法。(省略) 二,在需要加记录日志的方法上加Aop注解1,创建一个注解类,Aop中定义一个注解import java.lang.annotation.*; /*** http 请…...
编译原理个人作业--第四章
构造FIRST和FOLLOW的大白话网站 第四章 1 考虑文法 G 1 G_1 G1: S → a ∣ ∧ ∣ ( T ) T → T , S ∣ S S \rightarrow a|\land|(T) \\ T\rightarrow T,S|S S→a∣∧∣(T)T→T,S∣S 先复习左递归如何消除 原书p69页 类似于 P → P a ∣ b P\rightarrow Pa|b P→Pa∣b的…...
学习笔记:数据库简介
数据库是一系列可以方便的访问和修改的数据的集合。 所有数据库管理系统的主要工作都是可靠的存储数据并使其对用户可用。 目前最常见的数据库模型主要是两种,即关系型数据库和非关系型数据库。 一、按数据的组织方式 数据从组织的角度上,主要分为结…...
day18_集合
今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List 六、ArrayList 七、LinkedList 零、 复习昨日 晨考 一、集合框架体系 数组: 是一个容器,用来存放数据的 定长只能存储同一种数据类型的数据int[] 可以存储int值,Student[] 可以存储引用类型…...
Go面试必会基础题
文章目录 1.下面代码有什么错误?2.下面代码有什么问题?3.下面代码输出什么?4.下面这段代码输出什么? 1.下面代码有什么错误? func main() {one : 0one : 1 }参考答案及解析:变量重复声明。不能在单独的声…...
发送封包协议实现XXZ批量秒分解装备
通过发送封包,我们可以让一些反复的枯燥的行为变的简单,高效。 比如XXZ的萃取装备,我们可以一瞬间萃取大量的装备,而省去读条的过程。 我们来萃取一下看看效果 手动萃取是有读条的,那么如果很多装备的话,…...
Spring学习——Nginx
Nginx概述 Nginx介绍 Nginx是一款轻量级的web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx的网…...
记录 vue-cli 安装过程
1. VueCli CLI 是 Commond-Line Interface 的缩写 如果开发大型项目,肯定需要考虑代码目录结构、项目结构和部署、热加载、代码单元测试等事情,那么你必然需要使用 VueCLI,使用 VueCLI 可以快速搭建 vue 开发环境以及对应的 webpack 配置。 …...
含氢微网优化调度模型matlab
目录 1 主要内容 模型示意图 目标函数 2 部分程序 3 程序结果 4 下载链接 1 主要内容 最近咨询含氢微网优化调度模型的同学较多,本次就分享一个高质量的源码资源。该程序方法复现《Simulation of design and operation of hydrogen energy utilization syste…...
【springcloud开发教程】路由网关——zuul
官方资料:https://github.com/Netflix/zuul/ 什么是Zuul? Zuul包含了两个主要的功能:路由和过滤 路由功能将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预&#…...
DF竞赛平台携手嬴彻科技与清华大学智能产业研究院,助力自动驾驶挑战赛圆满落幕!
由DataFountain竞赛平台(简称DF平台)提供办赛支持的「首届“嬴彻-清华AIR杯”自动驾驶挑战赛:决策规划算法」已圆满落幕。作为一场前沿性自动驾驶类比赛,本次大赛立足“高速道路”和“城市道路”两大真实场景,选择“半…...
234:vue+openlayers 加载本地shp数据,在map上显示图形
第234个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用shapefile读取本地的shp数据,并在地图上显示图形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果安装引用配置方式示例源代码(共143行)相关API参考:专栏…...
网络模型-网络体系结构(OSI、TCP/IP)
网络模型(网络体系结构) 网络模型网络的体系结构OSI模型TCP/IP模型OSI和TCP/IP模型对应关系图 常见网络协议 网络模型 网络的体系结构 1、网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
