IOS Swift 从入门到精通:协议和扩展

文章目录

  • 协议
  • 协议继承
  • 扩展
  • 协议扩展
  • 面向协议的编程
  • 总结:

今天你将学习一些真正的 Swifty 功能:协议和面向协议的编程(POP)。

POP 摒弃了庞大而复杂的继承层次结构,代之以更小、更简单、可以组合在一起的协议。这确实应验了 Tony Hoare 多年前说过的一句话:“每个大型程序中,都有一个小程序试图脱颖而出。”

协议

协议是一种描述事物必须具有哪些属性和方法的方式。然后,您可以告诉 Swift 哪些类型使用该协议 - 这一过程称为采用或遵守协议。

例如,我们可以编写一个函数来接受具有属性的内容id,但我们并不关心具体使用哪种类型的数据。我们首先创建一个Identifiable协议,该协议要求所有符合要求的类型都有一个id可以读取(“get”)或写入(“set”)的字符串:

protocol Identifiable {var id: String { get set }
}

我们无法创建该协议的实例 - 它是我们想要的描述,而不是我们可以直接创建和使用的东西。但我们可以创建一个符合它的结构:

struct User: Identifiable {var id: String
}

最后,我们将编写一个displayID()接受任何Identifiable对象的函数:

func displayID(thing: Identifiable) {print("My ID is \(thing.id)")
}

协议继承

一个协议可以从另一个协议继承,这个过程称为协议继承。与类不同,您可以同时从多个协议继承,然后再在上面添加自己的自定义项。

我们将定义三个协议:Payable要求符合类型的实现一个calculateWages()方法、NeedsTraining要求符合类型的实现一个study()方法、HasVacation要求符合类型的实现一个takeVacation()方法:

protocol Payable {func calculateWages() -> Int
}protocol NeedsTraining {func study()
}protocol HasVacation {func takeVacation(days: Int)
}

现在我们可以创建一个Employee协议,将它们整合到一个协议中。我们不需要在顶部添加任何内容,因此我们只需编写开括号和闭括号即可:

protocol Employee: Payable, NeedsTraining, HasVacation { }

现在我们可以让新类型遵守单一协议,而不是遵守三个单独的协议。

扩展

扩展允许您向现有类型添加方法,使它们执行最初设计时未考虑的操作。

例如,我们可以向该Int类型添加一个扩展,使其具有squared()返回当前数字乘以自身的方法:

extension Int {func squared() -> Int {return self * self}
}

要尝试一下,只需创建一个整数,您就会看到它现在有一个squared()方法:

let number = 8
number.squared()

Swift 不允许在扩展中添加存储属性,因此您必须使用计算属性。例如,我们可以向isEven整数添加一个新的计算属性,如果它包含偶数,则返回 true:

extension Int {var isEven: Bool {return self % 2 == 0}
}

协议扩展

协议允许您描述某个对象应该具有哪些方法,但不提供其中的代码。扩展允许您提供方法中的代码,但仅影响一种数据类型 - 您无法同时将该方法添加到多种类型中。

协议扩展解决了这两个问题:它们就像常规扩展,不同之处在于您扩展的是特定类型,就像Int扩展整个协议一样,以便所有符合类型的类型都能获得您的更改。

例如,这是一个包含一些名称的数组和集合:

let pythons = ["Eric", "Graham", "John", "Michael", "Terry", "Terry"]
let beatles = Set(["John", "Paul", "George", "Ringo"])

Swift 的数组和集合都符合名为的协议Collection,因此我们可以对该协议进行扩展,以添加一个summarize()方法来整齐地打印集合

extension Collection {func summarize() {print("There are \(count) of us:")for name in self {print(name)}}
}

和Array现在Set都有该方法,因此我们可以尝试一下:

pythons.summarize()
beatles.summarize()

面向协议的编程

协议扩展可以为我们自己的协议方法提供默认实现。这使得类型更容易遵循协议,并允许一种称为“面向协议的编程”的技术 - 围绕协议和协议扩展编写代码。

首先,这里有一个名为的协议Identifiable,它要求任何符合要求的类型都具有id属性和identify()方法:

protocol Identifiable {var id: String { get set }func identify()
}

我们可以让每个符合要求的类型编写自己的identify()方法,但是协议扩展允许我们提供一个默认值:

extension Identifiable {func identify() {print("My ID is \(id).")}
}

现在,当我们创建一个符合Identifiable它的类型时,会identify()自动获得:

struct User: Identifiable {var id: String
}let twostraws = User(id: "twostraws")
twostraws.identify()

总结:

让我们总结一下:

  • 协议描述了符合类型必须具有的方法和属性,但不提供这些方法的实现。
  • 您可以在其他协议之上构建协议,类似于类。
  • 扩展允许您向特定类型添加方法和计算属性,例如Int。
  • 协议扩展允许您向协议添加方法和计算属性。
  • 面向协议的编程是将应用程序架构设计为一系列协议的实践,然后使用协议扩展来提供默认方法实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/32257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Magento1与Magento2的区别

本人接触magento有些年头了。。。 2012年开始用magento 1.7。2016年开始用magento2.0。 截止到目前。M1最新版本是1.9.3.3。 M2最新版本是2.2.2。 想当年第一次接触magento的时候,是跟同事一起,网上下载的Alan Storm的深入理解magento系统,…

【UML用户指南】-20-对基本行为建模-交互图

目录 1、概述 2、顺序图 2.1、两个不同于通信图的特征: 2.1.1、顺序图有对象生命线 2.1.2、顺序图有控制焦点 2.2、结构化控制 2.2.1、可选执行opt 2.2.2、条件执行alt 2.2.3、并行执行par 2.2.4、循环迭代执行loop 2.3、嵌套活动图 3、通信图 3.1、两…

【Python】实用脚本--大疆精灵4rtk照片信息提取

你是否想过,为啥就是拍个照片,为啥会占用几十上百兆? 其实除了照片的像素,照片里还附带了很多其他信息。 这个脚本是之前读取大疆精灵4rtk拍摄的照片信息用的,发出来,按需取用。 #!/usr/bin/env python # …

jnp.matmul和jnp.dot的区别?

jnp.matmul 和 jnp.dot 都是用于矩阵乘法的函数,但它们在处理多维数组(即张量)时有不同的行为。以下是它们的区别和具体用法: jnp.dot 主要用于向量点积和矩阵乘法。对于一维数组,计算向量的点积。对于二维数组&…

Flutter第十二弹 Flutter多平台运行

目标: 1.在多平台调试启动Flutter程序运行 一、安卓模拟器 1.1 检查当前Flutter适配的版本 flutter doctor提供了Flutter诊断。 $ flutter doctor --verbose /Users/zhouronghua/IDES/flutter/bin/flutter doctor --verbose [✓] Flutter (Channel master, 2.1…

【代码随想录算法训练Day45】LeetCode 198.打家劫舍、LeetCode 213.打家劫舍II、LeetCode 337.打家劫舍III

Day45 动态规划第七天 LeetCode 198.打家劫舍 dp数组含义:考虑偷前i家后的最大钱币为dp[i] 递推公式:dp[i]max(dp[i-2]nums[i],dp[i-1]) 初始化:dp[0]nums[0],dp[1]max(dp[0],dp[1]),dp[i]任意值 遍历顺序:从小到大 class Solu…

【硬件开发】电阻

电阻精度 电阻封装和功率的关系 裕度 50%的裕度,0603封装的功率为0.1W的情况下,实际只能使用0.05W的功率。 精度 温漂 零欧电阻 用法 1.跳线 如果不用某条线路,直接不焊零欧电阻就行 2.预留 后期调试看看需不需要更换为其他阻值例如33R的…

Docker 下载与安装以及配置

安装yum工具 yum install -y yum-ulits配置yum源 阿里云源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Docker 17.03后为两个版本: 社区版(Community Edition,缩写为 CE&#x…

Amazon 文本数据提取服务-Textract对比Amazon 自然语言处理服务-Comprehend

前言 在人工智能技术不断进步的当下,自然语言处理(NLP)和机器学习正变得越来越重要。Amazon Web Services(AWS)为我们提供了Amazon Textract 和 Amazon Comprehend这两大服务,帮助我们更好地处理和分析文本…

leetcode-15-[654]最大二叉树[617]合并二叉树[700]二叉搜索树中的搜索[98]验证二叉搜索树

一、[654]最大二叉树 注意:可以与后序中序建树一起写,思想类似 class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return traversal(nums,0, nums.length);}TreeNode traversal(int[] nums,int begin,int end){//左闭右开if(…

2024/06/21--代码随想录算法10-12/17| 子序列问题

300.最长递增子序列 力扣链接 动规五部曲 dp的定义 dp[i]表示子序列答案以nums[i]结尾的最长递增子序列的长度 为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两…

【机器学习 复习】第9章 降维算法——PCA降维

一、概念 1.PCA (1)主成分分析(Principal ComponentAnalysis,PCA)一种经典的线性降维分析算法。 (2)原理,这里以二维转一维为例,原来的平面变成了一条直线 这是三维变二…

Leetcode85

题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 解题思路 动态规划的思想,记录每一个位置向上能到达的最大高度,和向左能到达的最大宽度。 在一个点进行遍历时…

Langchain 如何工作

How does LangChain work? LangChain是如何工作的? Let’s consider our initial example where we upload the US Constitution PDF and pose questions to it. In this scenario, LangChain compiles the data from the PDF and organizes it. 让我们考虑我们最初的例子…

@Value+@ConfigurationProperties+@PropertySource

Value: 这个注解用于注入字面量或来自属性文件的值。它可以用于字段、构造函数参数、方法参数等。例如,Value("${property.name}") 会注入名为 property.name 的属性值。 ConfigurationProperties: 这个注解用于将配置属性映射到一…

红队攻防渗透技术实战流程:中间件安全:IISNGINXAPACHETOMCAT

红队攻防渗透实战 1. 中间件安全1.1 中间件-IIS-短文件&解析&蓝屏等1.2 中间件-Nginx-文件解析&命令执行等1.2.1 后缀解析 文件名解析1.2.2 cve_2021_23017 无EXP有POC1.2.3 cve_2017_7529 意义不大1.3 中间件-Apache-RCE&目录遍历&文件解析等1.3.1 cve_20…

荷兰与法国战平,双方能携手出现?

就在昨天晚上,荷兰队经历了90分钟的鏖战,最终0-0与法国队握手言和。此役,哈维-西蒙斯为荷兰队打进一球,但进球被判无效。从目前的积分形势来看,双方基本上确定携手晋级16强赛。本场比赛,荷兰队后卫内森-阿克…

GPT 模型简史:从 GPT-1 到 GPT-4

文章目录 GPT-1GPT-2GPT-3从 GPT-3 到 InstructGPTGPT-3.5、Codex 和 ChatGPTGPT-4 GPT-1 2018 年年中,就在 Transformer 架构诞生⼀年后,OpenAI 发表了⼀篇题 为“Improving Language Understanding by Generative Pre-Training”的论文,作者…

告别卡顿,迎接流畅!你的mac电脑清洁利器CleanMyMac一键轻松解决所有问题!

亲爱的CSDN家人们,今天要安利的是一个让无数Mac用户从“抓狂”到“惊喜连连”的小神器—CleanMyMac!💫 如果你还在为电脑的缓慢启动、存储空间告急和莫名其妙的卡顿烦恼,那请跟我一起看看它如何成为你的数字世界里的救星&#xff…

VC++学习(5)——文本编程,插入符的初始化,图形插入符;文字始终在窗口;字符输入功能,回车换行,删除,左键定位;字体修改,字体平滑变色

目录 引出第五讲 文本编程新建项目输入线的初始化根据字体大小定义插入符大小创建图形插入符文字始终保存在窗口中CString类通过字符串资源 路径层字符输入的功能键盘输入消息鼠标左键消息保存点击位置的坐标 输入回车键的处理删除文字的实现 字符输入功能代码字体的修改模拟卡…