Swift泛型与协议扩展深度解析

立即解锁
发布时间: 2025-09-12 01:52:38 阅读量: 9 订阅数: 32 AIGC
PDF

Swift编程实战精要

### Swift 泛型与协议扩展深度解析 #### 1. 泛型中 `where` 子句的类型约束 在 Swift 里,`where` 关键字功能强大,它不仅能在循环或 `switch` 语句里施加约束,还能在函数声明时对泛型参数或返回类型进一步约束。下面是一个给 `Stack<Element>` 添加方法的例子,该方法可把数组中的每个元素压入栈中: ```swift struct Stack<Element>: Sequence { // 其他代码... mutating func pushAll(_ array: [Element]) { for item in array { self.push(item) } } } // 使用示例 for value in myStack { print("for-in loop: got \(value)") } myStack.pushAll([1, 2, 3]) for value in myStack { print("after pushing: got \(value)") } ``` 不过,`pushAll(_:)` 方法虽有用,但通用性欠佳。因为任何符合 `Sequence` 协议的类型都能用于 `for-in` 循环,所以该方法不应局限于数组,而应能接受任何序列,像同样符合 `Sequence` 协议的 `Stack` 也可。 但首次尝试修改会在调用 `self.push(_:)` 时产生编译时类型错误: ```swift struct Stack<Element>: Sequence { // 其他代码... mutating func pushAll<S: Sequence>(_ sequence: S) { for item in sequence { self.push(item) } } } ``` 这里把 `pushAll(_:)` 方法泛型化,用占位类型 `S` 表示符合 `Sequence` 协议的类型,虽能保证可用 `for-in` 循环遍历,但还不够。要把序列中的元素压入栈,需确保序列元素类型与栈元素类型匹配,即添加约束:序列 `S` 产生的元素类型为 `Element`。Swift 借助 `where` 子句支持此类约束: ```swift struct Stack<Element>: Sequence { // 其他代码... mutating func pushAll<S: Sequence>(_ sequence: S) where S.Element == Element { for item in sequence { self.push(item) } } } ``` 此时,占位类型 `S` 要符合 `Sequence` 协议且满足 `where` 子句要求。`S.Element` 指序列 `S` 关联的 `Element` 类型,约束 `S.Element == Element` 要求 `Element` 关联类型的具体类型与栈的 `Element` 占位类型具体类型匹配。 下面是使用示例: ```swift var myOtherStack = Stack<Int>() myOtherStack.pushAll([1, 2, 3]) myStack.pushAll(myOtherStack) for value in myStack { print("after pushing items onto stack, got \(value)") } ``` 需注意,若协议有关联类型,当前不能把该协议用作变量或函数声明中的类型。例如,`Sequence` 有关联类型 `Element`,以下代码无法编译: ```swift func printElements(from sequence: Sequence) { for item in sequence { print(item) } } ``` 不过,可把协议用作泛型类型约束: ```swift func printElements<S: Sequence>(from sequence: S) { for element in sequence { print(element) } } ``` #### 2. 泛型组合与不透明类型 泛型数据结构可通过协议相互组合,构建能优雅描述复杂概念的类型系统。例如,字典数组的组合类型可能是 `Array<Dictionary<String,Int>>`。有时,我们想隐藏组合的一些实现细节。 下面以餐厅里饥肠辘辘的人点烤面包为例。先定义 `Food` 协议和符合该协议的食物: ```swift protocol Food { var menuListing: String { get } } struct Bread: Food { var kind = "sourdough" var menuListing: String { "\(kind) bread" } } func eat<T: Food>(_ food: T) { print("I sure love \(food.menuListing).") } eat(Bread()) ``` 接着定义餐厅结构体及嵌套结构体,用于定义餐厅可能制作的食物的准备方式: ```swift struct Restaurant { struct SlicedFood<Ingredient: Food>: Food { var food: Ingredient var menuListing: String { "a slice of \(food.menuListing)" } } struct CookedFood<Ingredient: Food>: Food { var food: Ingredient var menuListing: String { "\(food.menuListing), cooked to perfection" } } func makeSlicedBread() -> SlicedFood<Bread> { return SlicedFood(food: Bread()) } func makeToast() -> Coo ```
corwn 最低0.47元/天 解锁专栏
买1年送3月
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

陆鲁

资深技术专家
超过10年工作经验的资深技术专家,曾在多家知名大型互联网公司担任重要职位。任职期间,参与并主导了多个重要的移动应用项目。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

误差来源全面曝光:斜边法MTF计算的校正方法研究

# 摘要 斜边法是光学成像系统中常用的调制传递函数(MTF)测量方法,但其在实际应用中存在多种误差来源,影响测量精度。本文系统阐述了斜边法MTF计算的基本原理,深入分析了光学系统像差、探测器响应非理想、边缘定位误差、环境噪声等导致测量偏差的关键因素。在此基础上,构建了基于数学建模的误差校正理论框架,提出了多项式拟合与误差补偿策略,并通过实验验证了校正模型的有效性与适应性。研究结果为提升MTF测量精度提供了理论支持和技术路径,同时为工程实践中实现高精度、实时MTF检测提供了可行方案。 # 关键字 斜边法;MTF;误差校正;光学像差;边缘响应;傅里叶变换 参考资源链接:[图像斜边MT

多线程环境下的卡尺测量优化:OpenCV并发处理的3大核心技巧

# 摘要 本文围绕多线程技术在图像处理中的应用展开研究,重点分析OpenCV中的并发处理机制及其在卡尺测量算法优化中的实践。文章首先介绍多线程与图像处理的基础概念,继而深入探讨OpenCV支持多线程的机制、线程池管理策略以及资源竞争问题的解决方案。随后,通过卡尺测量算法的并行优化案例,分析单帧与多帧图像的并发处理方法,并评估其性能提升效果。最后,文章提出多线程环境下系统性能优化和稳定性增强的关键策略,包括内存管理、异常处理及系统调优方案,为高性能图像处理系统的开发提供技术参考。 # 关键字 多线程;图像处理;OpenCV;卡尺测量;并发处理;线程池 参考资源链接:[一维卡尺测量与

【MFC网络功能拓展】:一键上传分享截图的HTTP集成指南(含HTTPS安全传输方案)

![MFC截图(仿QQ截图)](https://www.befunky.com/images/wp/wp-2022-07-batch-watermark-step-5-create-watermark.jpg?auto=avif,webp&format=jpg&width=944) # 摘要 本文围绕基于MFC平台实现截图上传功能的技术方案展开,系统性地分析了MFC网络通信机制、HTTP/HTTPS协议应用及截图处理流程。首先,文章解析了HTTP协议结构与MFC网络编程接口,构建了基础网络通信框架,并实现文件上传功能。随后,详细阐述了截图功能的界面设计、图像处理方法及其与上传逻辑的整合,

【Python类异常处理设计之道】:优雅处理错误与异常的全面方案

![【Python类异常处理设计之道】:优雅处理错误与异常的全面方案](https://img-blog.csdnimg.cn/img_convert/003bf8b56e64d6aee2ddc40c0dc4a3b5.webp) # 摘要 本文系统探讨了Python异常处理的核心理念、理论结构及其在实际开发中的应用策略。从基本语法出发,分析了异常处理的机制、分类及执行流程,并深入讨论了自定义异常的设计原则与常见设计模式。文章结合函数、模块及Web应用等实际场景,阐述了异常处理在不同层级的实践方法,并探讨了异常在系统级错误恢复、日志记录及安全控制中的关键作用。同时,针对性能瓶颈与调试难题,

非平稳信号处理进阶:红白噪声检验的核心作用与Matlab应用

![非平稳信号处理进阶:红白噪声检验的核心作用与Matlab应用](https://img-blog.csdnimg.cn/2020112915251671.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NodWlkaWRlaHVheWlyZW4=,size_16,color_FFFFFF,t_70) # 摘要 红白噪声检验在非平稳信号处理中具有重要作用,是识别信号中噪声成分、提升分析精度的关键技术。本文系统阐述了红白噪声的基本

自动驾驶感知升级:偏振摄像头的5大核心优势揭秘

![自动驾驶感知升级:偏振摄像头的5大核心优势揭秘](https://avitechhub.com/wp-content/uploads/2024/03/Drone_flying_in_rain_web-1024x576.jpg) # 摘要 随着自动驾驶技术的快速发展,感知系统的精准性与可靠性成为研究重点。偏振摄像头因其在复杂光照、恶劣天气及材质识别等方面的独特优势,逐渐成为自动驾驶感知技术的重要组成部分。本文系统梳理了偏振摄像头的发展背景、成像原理及其在自动驾驶中的关键应用,深入分析其硬件结构、数据处理流程及多场景适应能力。同时,探讨了偏振摄像头在实际部署中面临的系统集成、算力需求与技

BCH生成矩阵优化全攻略:3大技巧提升编码效率与性能

![BCH生成矩阵优化全攻略:3大技巧提升编码效率与性能](https://media.springernature.com/lw1200/springer-static/image/art%3A10.1007%2Fs42979-021-00994-x/MediaObjects/42979_2021_994_Fig10_HTML.png) # 摘要 BCH码是一种重要的循环纠错码,其生成矩阵的设计与优化直接影响编码效率与实现复杂度。本文系统介绍了BCH编码的基础理论与生成矩阵的数学原理,深入分析了生成矩阵的构造方法及其关键性质,包括系统与非系统形式的转换、稀疏性与结构优化等。在此基础上,

低耗SDK设计指南:移动环境下电量与流量控制技巧

![低耗SDK设计指南:移动环境下电量与流量控制技巧](https://img-blog.csdnimg.cn/direct/8979f13d53e947c0a16ea9c44f25dc95.png) # 摘要 随着移动应用功能日益复杂,资源消耗问题成为影响用户体验和应用性能的关键因素。本文系统研究了移动应用开发中的电量与流量优化问题,深入分析了移动设备电量消耗的主要来源与流量控制机制,探讨了Android与iOS平台在电量管理上的差异,并提出了基于用户行为的流量预测模型与优化策略。针对低耗SDK的开发实践,本文设计了模块化架构与自适应调控算法,并通过性能测试与A/B对比验证了优化效果。

多相滤波器实战部署:通信系统应用中的10大注意事项

![信道化仿真代码-多相滤波](https://connecthostproject.com/images/8psk_table_diag.png) # 摘要 多相滤波器作为现代通信系统中的关键信号处理组件,广泛应用于信道化处理、插值抽取、数字下变频等领域。本文系统阐述了多相滤波器的基本原理、数学建模及其在通信系统中的功能角色,深入分析了其理论基础、设计流程与实现方式,并比较了其与传统滤波技术的性能差异。文章进一步探讨了部署过程中涉及的资源控制、精度管理及同步问题,结合实际应用场景,展示了多相滤波器在无线接收机和DDC系统中的集成方案与优化策略,为通信系统设计与实现提供了理论依据与工程参

高并发场景下稳定性如何保障?PowerBuilder正则表达式多线程实战解析

![高并发场景下稳定性如何保障?PowerBuilder正则表达式多线程实战解析](https://ask.qcloudimg.com/http-save/yehe-4337369/ygstpaevp5.png) # 摘要 在高并发场景下,系统稳定性成为软件架构设计中的核心挑战。本文围绕高并发系统的基本理论、多线程编程实践以及正则表达式的高效应用展开研究,系统分析了并发模型、线程调度、资源竞争、限流降级、熔断机制等关键技术点。以PowerBuilder平台为实践基础,深入探讨了多线程任务的创建、同步与优化策略,并结合正则表达式的高级应用,提出在高并发环境下提升文本处理效率的优化方案。通过