当前位置: 首页 > news >正文

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。
  • 协议扩展允许您向协议添加方法和计算属性。
  • 面向协议的编程是将应用程序架构设计为一系列协议的实践,然后使用协议扩展来提供默认方法实现。

相关文章:

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

文章目录 协议协议继承扩展协议扩展面向协议的编程总结: 今天你将学习一些真正的 Swifty 功能:协议和面向协议的编程(POP)。 POP 摒弃了庞大而复杂的继承层次结构,代之以更小、更简单、可以组合在一起的协议。这确实应…...

Vue插件开发:Vue.js的插件架构允许开发者扩展Vue的核心功能,我们可以探讨如何开发一个Vue插件并与社区分享

了解Vue插件 Vue插件的概念: Vue插件用于为Vue.js添加全局级别的功能。它提供了一种开箱即用的机制来应用全局性的功能扩展。这些插件通常用来将全局方法或属性,组件选项,Vue实例的方法,或者注入一些组件选项比如mixins和自定义方法添加至Vue.js。 Vue插件的使用场景:…...

学习面向对象前--Java基础练习题

前言 写给所有一起努力学习Java的朋友们,敲代码本身其实是我们梳理逻辑的一个过程。我们在学习Java代码的过程中,除了需要学习Java的一些基本操作及使用,更重要的是我们需要培养好的逻辑思维。逻辑梳理好之后,我们编写代码实现需要…...

用Python实现抖音新作品监控助手,实时获取博主动态

声明: 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。包含关注,点赞等 该项目的主要功能是通过Python代码&…...

图像分隔和深度成像技术为什么受市场欢迎-数字孪生技术和物联网智能汽车技术的大爆发?分析一下图像技术的前生后世

图像分隔和深度成像是计算机视觉和图像处理领域的两项重要技术,它们各自有不同的技术基础和要点。 图像分隔技术基础: 机器学习和模式识别: 图像分隔通常依赖于机器学习算法,如支持向量机(SVM)、随机森林…...

Redis 内存策略

一、Redis 内存回收 Redis 之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 我们可以通过修改配置文件来设置 Redis 的最大内存&#xff1a; # 格式&#xff1a; # maxmemory <byt…...

Java小实验————斗地主

早期使用的JavaSE用到的技术栈有&#xff1a;Map集合,数组&#xff0c;set集合&#xff0c;只是简单实现了斗地主的模拟阶段&#xff0c;感兴趣的小伙伴可以调试增加功能 代码如下&#xff1a; import java.util.*;public class Poker {public static void main(String[] arg…...

【Oracle】Linux 卸载重装 oracle 教程(如何清理干净残留)系统 CentOS7.6

总览 1.停止监听 2.删除 Oracle 数据库实例 3.删除 Oracle 相关服务 4.删除 Oracle 服务脚本 5.清理 Oracle 软件和配置文件 6.强制卸载 Oracle 软件包 一、开始干活&#xff08;所有操作使用 root 权限&#xff0c;在 root 用户下执行&#xff09; 1.停止监听 lsnrctl sto…...

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell Jenkins弱口令 默认用户一般为jenkins/jenkins 使用admin/admin123登陆成功 Jenkins反弹shell 格式为 println"命令".execute().text 在/tmp目录中生成shell.sh文件&#xff0c;并向其中写入反弹shell的语句 new…...

Linux开发讲课9--- Linux的IPC机制-内存映射(Memory Mapping)

Linux的IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09;机制是多个进程之间相互沟通的方法&#xff0c;它允许不同进程之间传播或交换信息。Linux支持多种IPC方式&#xff0c;包括但不限于&#xff1a; 管道&#xff08;Pipe&#xff09;&#…...

Java赋值运算符

Java赋值运算符分为以下&#xff1a; 符号 作用 说明 赋值 int a 10,把10赋值给变量a 加后赋值 ab,将ab的值赋值给变量a - 减后赋值 a-b,将a-b的值赋值给变量a* 乘后赋值 a*b,将a*b的值赋值给变量a / 除后赋值 a/b,将a/b的值赋值给变量a % 取余赋值 a%b,将a%b的值赋值给变量…...

Qt做群控系统

群控系统顾名思义&#xff0c;一台设备控制多台机器。首先我们来创造下界面。我们通过QT UI设计界面。设计界面如下&#xff1a; 登录界面&#xff1a; 登录界面分为两种角色&#xff0c;一种是管理员&#xff0c;另一种是超级管理员。两种用户的主界面是不同的。通过选中记住…...

【专业英语 复习】第10章 Information System

1. 单选题 (1分) An example of this type of report would be a sales report that shows that certain items are selling significantly above or below forecasts. () A. Inventory B. Demand C. Periodic D. Exception 正确答案&#xff1a; D 这种类型的报…...

09-axios在Vue中的导入与配置

09-axios 前言首先简单了解什么是Axios&#xff1f;以上完成后就可以使用了 前言 我们接着上一篇文章 08-路由地址的数据获取 来讲。 下一篇文章 10-vuex在Vue中的导入与配置 首先简单了解什么是Axios&#xff1f; Axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端…...

odoo17 小变更4

odoo17 小变更4 1、代码中去除了访问私人地址权限,但翻译中均还有,怪不 model:res.groups,name:base.group_private_addresses msgid "Access to Private Addresses" msgstr "" 代码也查看了,的确没有了此权限组 --><record model="res.g…...

Flink assignTimestampsAndWatermarks 深度解析:时间语义与水印生成

目录 概述 时间语义 时间戳分配 水印的作用 最佳实践 案例分析 注意事项 应用场景 概述 在Apache Flink中,assignTimestampsAndWatermarks是一个重要的方法,它允许数据流处理程序根据事件时间(event time)分配时间戳和生成水印(watermarks)。这个方法通常用于处理…...

C++排序算法——合并有序数组

合并有序数组 思路 我们可以设想一个排序的函数 这个函数里 我们有三个while while(第一次的执行条件) {先进行第一次的合并 } while(第二次的合并条件) { 把a数组在第一次没有排序上的给加进去 }while(第三次的合并条件) { 把b数组在第一次没有排序上的给加进去 }看完了这个…...

安装pytorch环境

安装&#xff1a;Anaconda3 通过命令行查显卡nvidia-smi 打开Anacanda prompt 新建 conda create -n pytorch python3.6 在Previous PyTorch Versions | PyTorch选择1.70&#xff0c;安装成功&#xff0c;但torch.cuda.is_available 返回false conda install pytorch1.7.0…...

内卷从古到今就一直存在,并不是近年的“新物”,破局在于你是否有意识地学习。

一.背景&#xff1a; 反思自己过去从学生时代到职场时代。“内卷”其实已经一直存在&#xff0c;从古到今都一直存在&#xff0c;也并不是近几年产出的“新物”。已经连续5年高考人数在1000万以上&#xff0c;而今年1300多万达到新高&#xff0c;对于竞争压力如此之大&#xf…...

跟《经济学人》学英文:2024年6月15日这期 The war for AI talent is heating up

The war for AI talent is heating up Big tech firms scramble to fill gaps as brain drain sets in 争夺人工智能人才的战争正在升温 随着人才流失的到来&#xff0c;大型科技公司争相填补空缺 brain drain&#xff1a;人才流失 scramble&#xff1a;争夺&#xff1b;争…...

港湾周评|高盛眼中的618增长

《港湾商业观察》李镭 年中最重要的购物节618终于尘埃落定了。2024年的618各大电商平台竞技情况如何&#xff1f;又有哪些新的亮点&#xff1f;都成为外界观察消费行为的参考指标。 根据京东618数据显示&#xff1a;累计成交额过10亿的品牌83个&#xff0c;超15万个中小商家销…...

SPSS知识

特点 SPSS的一些特点&#xff1a; 分析结果清晰、直观&#xff1a;SPSS提供了丰富的图表和表格&#xff0c;可以帮助用户直观地理解数据分析的结果。分析结果通常包含详细的统计量、图形和文本描述&#xff0c;使得分析结果易于解释。 易学易用&#xff1a;SPSS的用户界面设计…...

【网络安全的神秘世界】关于Linux中一些好玩的字符游戏

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 佛祖保佑 把 motd 通过xtp拖到Linux中 liyangUbuntu2204:~$ cp motd /etc/motd #一定要放在etc下 liyangUbuntu2204:~$ exi…...

【LeetCode】Hot100:验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 英文题目 Given the root…...

[Qt] Qt Creator 编译输出乱码,问题页中的报错、警告内容,编译输出乱码

确保文件编码为"UTF-8"&#xff0c;"如果编码是UTF-8则添加"&#xff0c;如下图&#xff1a; 设置IDE环境语言跟随系统语言&#xff0c;Text codec for tools&#xff1a; "System" 瑞斯拜...

sed

1、sed的定义 sed是一种流编辑器&#xff0c;按行处理&#xff0c;一次处理一行内容 处理方式&#xff1a;如果只是展示&#xff0c;会放在缓冲区&#xff08;模式空间&#xff09;&#xff0c;展示结束后&#xff0c;会从模式空间把操作结果删除 一行一行处理&#xff0c;处…...

C++一文讲透thread中的detach和join的差别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、thread详解二、线程何时运行三、线程启动方式1.join2.detach 总结 前言 无论哪种语言线程在绝大多数项目中都是会用到的&#xff0c;C也一样&#xff0c;C…...

当Windows台式电脑或笔记本电脑随机关机时,请先从这8个方面检查

序言 你的Windows笔记本电脑或PC是否意外关闭?笔记本电脑电池故障、电源线松动、过热、电源设置错误、驱动程序过时或电脑组件故障等问题都可能是罪魁祸首。如果你对这个问题感到沮丧,试试这些解决方案。 进行一些初步检查 与从电池中获取电力的笔记本电脑不同,台式电脑依…...

【凤凰房产-注册安全分析报告-缺少轨迹的滑动条】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

【建议收藏】逻辑回归面试题,机器学习干货、重点。

. . . . . . . . . . .纯 干 货 . . . . . . . . . . . .今天是机器学习面试题&#xff0c;16大块的内容&#xff0c;124个问题总结的第二期&#xff1a;逻辑回归面试题。 逻辑回归是一种用于解决分类问题的统计学习方法&#xff0c;尤其在二分类…...

德州做网站的公司/营销宣传策划方案

PAGEPAGE 71、 秦九韶算法 2、二分法 3、拉格朗日插值 4、埃特金算法 5、复化梯形法6、复化辛甫生算法 7、二阶龙格库塔方法 8、四阶龙格库塔方法 9、改进的欧拉方法 10、迭代法 11、埃特金加速方法&#xff1a;12、牛顿迭代法 13、追赶法 14、雅克比迭代 15、蛋白质设计…...

杭州网站提升排名/软文街官方网站

人们日常熟知的邮政业务包括邮务业务、快递业务、银行业务、保险业务、证券业务、网上商城等&#xff0c;除此之外&#xff0c;还有一项非常重要——电商业务。区别于人们熟知的电商网购&#xff0c;邮政公司电商业务主要是指人们日常生活中的代收费业务&#xff08;包括水、电…...

世界室内设计公司排名/郑州官网网站推广优化

-------------------siwuxie095 ResponseBody 使用须知 使用 ResponseBody 注解映射响应体 ResponseBody 注解可被应用于方法上&#xff0c;标志该方法的返回值 应该被直接写回到 HTTP 响应体中去&#xff08;而不会被被放置到 Model 中 或 被解释为一个视图名&#xff09; …...

昆明高端网站建设/杭州优化排名哪家好

2019独角兽企业重金招聘Python工程师标准>>> HDFS小文件处理解决方案总结facebook(HayStack) 淘宝&#xff08;TFS&#xff09; 博客分类&#xff1a; 数据库 hbase 一、概述 手机图片或者像淘宝这样的网站中的产品图片特点&#xff1a; &#xff08;1&#xff09;…...

电子手表网站/关于营销的最新的新闻

网络框架的选择 C++语言里面有asio和libuv等网络库, 可以方便的进行各种高效编程. 但是C#里面, 情况不太一样, C#自带的网络API有多种. 例如: Socket TcpStream(同步接口和BeginXXX异步接口) TcpStream Async/Await Pipeline IO ASP.NET Core Bedrock 众多网络库, 但是每个编程…...

西安网站建设行业动态/制作网站免费

Responsive Nav 是一个很小的 JavaScript 插件&#xff0c;压缩后只有 1.7 KB&#xff0c;可以帮助您实现小屏幕导航切换功能。它采用触摸事件和 CSS3 过渡提供最佳性能&#xff0c;它还包含一个“聪明”的解决方法&#xff0c;借助 CSS3 transitions 特性使高度从height: 0 过…...