热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[swift进阶]读书笔记第十章:协议C10P3带有Self的协议ProtocolswithSelfRequirements...

第十章:协议ProtocolProtocol-OrientedProgramming10.3带有Self的协议ProtocolswithSelfRequirement

第十章:协议 Protocol Protocol-Oriented Programming

10.3 带有 Self 的协议 Protocols with Self Requirements

本小节的知识点比较单一,主要是围绕带有Self的协议来讲的

什么是带有 Self 要求的协议?

当我们的协议中需要引入自身相关的参数或者返回自身相关的返回值的时候用self (书中并没有明确的解锁,外国大佬写的书直接上了就干demo了。上面对self的解释是我查了很多资料的结果,看起来的确是废话,哈哈但让解释也只能这样解释?)

带有 Self 要求的协议在行为上和那些带有关联类型的协议很相似

最简单的是 Equatable

protocol Equatable {static func ==(lhs: Self, rhs: Self) -> Bool
}


我们来写一个最简单的带有self协议的Demo。 一眼一看就会了?

protocol GHEqual {///这里引入了selfstatic func == (lhs: Self, rhs: Self) -> Bool
}class Person: NSObject, GHEqual {var gender: String = ""///这里实现的时候系统会自动将self替换成了具体的类型。static func == (lhs: Person, rhs: Person) -> Bool {if lhs.gender == rhs.gender {return true} else {return false}}
}let personA = Person()
personA.gender = "male"let personB = Person()
personB.gender = "male"let isSame = (personA == personB) ///true

小疑问❓:

在我们的认知中上面用到的 == 应该是对象方法。 为嘛在协议中声明的时候会用 static func? 我目前的结论是在协议中写操作符号时 对象方法也是用static func? 各位大佬可以把你们的想法分享出来。大家一起学习一下?。

疑问后续❗️:

后来我查阅资料,在StackOverflow中有人提到了这个问题 Why must a protocol operator be implemented as a global function? 其大概解释就是 由于swift语法的原因,操作符的实现必须是一个全局函数。 感兴趣的同学可以看看问题中大牛们的回答。

我们不能简单地用 Equatable 来作为类型进行变量声明:

和上一节的关联类型协议一样,我们不能把带有self的协议作为类来变量声明

let x: Equatable = MonetaryAmount(currency: "EUR", amountInCents: 100)
// 会编译错误:因为 'Equatable' 协议中有 Self 或者关联类型的要求,
// 所以它只能被⽤用作泛型约束

文章源文件地址,大家如果有更好的想法和观点欢迎交流



推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文整理了Java中com.evernote.android.job.JobRequest.getTransientExtras()方法的一些代码示例,展示了 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
迈迈最love
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有