关于“幽灵架构”的补充说明4:协议的应用场景与局限性

再次解释一下协议的意义:定义某个功能模块的最小粒度,因为Swift是单继承,而无论是值类型还是引用类型都可以遵守多个协议,因此协议是比父类的粒度还要小的功能模块。协议的功能定义一定要具体并且严格,someObject:Protocol where …中where子句的匹配条件只能针对someObject的类型或者遵守的其他协议,以及Protocol中的associatedType的约束,也就是说不能根据someObject中的成员判断是否遵守该协议。举例如下:

Swift标准库中的很多基础类型都遵守了Equatable协议,这个协议要求用户定义一个==方法,这表明虽然每个类型判断是否相等的标准不同,但是在任何情况下两个遵守了Equatable协议的相同类型都可以判等,这是协议为我们所做的工作。考虑我们常用的数组,Array中也可以使用==运算,但是Array并没有遵守Equatable协议,这是因为调用Array实例的==方法的时候编译器会做限制,只有Array中所保存的元素遵守了Equatable协议的时候,Array才能进行判等,所以Array不是在任何条件下都能进行判等的,不符合Equatable协议的功能描述。这种情况下我们需要直接定义一个方法:

func ==<T: Equatable>(lhs: [T], rhs: [T]) -> Bool {
     //对比las和rhs中的元素是否相等
}

方法的好处是你可以引用任意的泛型作为占位符来描述功能呢,比如这里的T,这样就可以规范两个参数必须是相同类型的数组,并且元素遵守Equatable。当Array中的元素不遵守Equatable时,在编译期调用==就会收到编译器错误。

而在使用协议的时候,someObject:Protocol where …这里的where只能对协议中声明的associatedType进行约束,而不能引入向T这样额外的占位符来描述约束。

时间: 2024-11-05 22:55:43

关于“幽灵架构”的补充说明4:协议的应用场景与局限性的相关文章

关于“幽灵架构”的补充说明1:协议中的方法定义

承接上一篇博文,上一篇的篇幅有点太长了,我觉得有一些相关的技术点需要说明,所以重新写几篇博文.这个系列的文章将要说明以下几个问题: 1.giveData和getData在各自协议中的位置 2.使用struct代替class的好处 3."幽灵架构"为什么不会产生循环引用 4.协议的应用场景与局限性 5.运用面向协议编程思想改造控制器 让我们来简单回顾下这个架构,如果不明白的可以参考上一篇博文: 核心只有两个协议: //视图使用的协议 protocol ViewType{ func get

关于“幽灵架构”的补充说明3:为什么不会产生“循环引用”

承接上文,已经简明阐述了使用Struct代替Class的好处,使用Class会使我们的程序出现"意外的共享"以及"循环引用"之类的危险,传统面向对象开发中对Class的依赖主要来自于我们对"继承"的依赖.Swift2.0引入协议扩展后,之前的"类-继承"所能实现的功能使用"结构体(枚举)-协议-协议扩展"都可以实现,并且更加高效和灵活.回到主题上来,首先回顾下"幽灵架构"中的两个主体:V

关于“幽灵架构”的补充说明5:改造控制器

Swift中的泛型有非常多的用处,除了我在之前介绍的方法中作为占位符之外,还可以被用在协议中,构成一个泛型协议,那么遵守这个泛型协议的成员就会变成泛型成员.还用我们之前的事件节日提醒Demo来展示,在之前的版本中我们使用了一个TableView来展示数据,现在如果有新的需求,需要在CollectonView中做类似的排列,并且针对数据源提供日期的筛选功能,面对相似的功能需求显然你不想写两份代码,那么此时最好的办法就是提炼出一个协议来,并且在协议扩展中声明一份默认的实现. 让我们来实现第一步:分析

关于“幽灵架构”的总结:适用场景与方法重载

前几篇博文对"幽灵架构"做了用法的介绍和相关技术点的补充,本文是一篇总结性质的文章,分析该架构的适用场景和限制,首先让我们回顾一下iOS开发的MVC模式,参考斯坦福公开课里Paul老爷子的讲解,如下图所示: 在MVC模式下Model和View是不能直接通信的,在"幽灵架构"体系中Model和View依旧不能直接通信,在传统的MVC中,这种通信的阻隔很多时候是因为在没有得到Model和View实体的情况下无法完成二者的数据绑定,在过去你可能想过在View中写一个方法来

第8章 传输层(1)_TCP/UDP协议的应用场景

1. 传输层的两个协议 1.1 TCP和UDP协议的应用场景 (1)TCP协议:如果要传输的内容比较多,需要将发送的内容分成多个数据包发送.这就要求在传输层用TCP协议,在发送方和接收方建立连接,实现可靠传输.流量控制和拥塞避免.(如下载500M电影.QQ好友传输文件.浏览网页.发送电子邮件等) (2)UDP协议:一个数据包就能发送全部内容,不需要持续发送,发送方和接收方不需要建立连接.由于就一个数据包不需要流量控制和拥塞避免,在传输层不需要负责可靠传输.如果数据包发送出去,应用程序没有收到返回

3-1-企业级架构拓展思路及集群负载均衡场景介绍

单主机不仅受限于硬件性能也受限于并发模型,select()1024scale up向上扩展,用性能更好的主机代替性能略差的主机scale out向外扩展,多加主机,分割任务,将任务分散处理,这叫做负载均衡集群load blancing cluster,简称为LB集群第一步:分散用户请求第二步:追踪用户请求状态信息,这是一个问题第三步:用户上传文件的路径在哪?使用共享存储或者专用户专机专用存储(其他用户就看不见本用户上传的文件了),要有两种共享存储,一种存图片,一种存数据(数据库) 补充知识:数据

常用的流媒体协议及其应用场景等信息总结

近日一直被直播延时问题所困惑,为此特整理一些关于常用流媒体的协议信息,希望能对自己解决直播延时有所帮助. 1.RTMP(Real Time Messaging Protocol)Adobe推出的实时消息传输协议.该协议基于TCP,是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信,默认端口1935.一般传输的是flv,f4v格式流 2.RTSP/RTP/RTCP协议族(Real-time Streaming P

物联网云平台常用协议和应用场景

雷军说过“在风口上猪都能飞起来”,2019是物联网爆发式增长的一年,在毛衣争端升级持续,实体经济增长放缓(其实你懂的),互联网泡沫裁员,就在这种大环境不好的情况下,很多人换工作都要谨慎再谨慎,而物联网行业却逆势爆发增长,相关公司业绩,这里以无线模组公司为例,增长大多超过100%,业绩创历史新高. ? 风口已到,你上车了吗?今天给大家介绍下物联网云平台支持的大多数协议已经其特征和应用场景.本文不讨论不同物联网平台的差异和特点,这个将会在以后的文章中给大家介绍(毕竟现在还没玩过足够多的平台嘛) ?

XMPP协议的原理介绍

XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探測.它在促进server之间的准即时操作.这个协议可能终于同意因特网用户向因特网上的其它不论什么人发送即时消息,即使其操作系统和浏览器不同. XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议.XMPP眼下被IETF国际标准组织完毕了标准化工作.标准化的核心结果分为两部分: 在IETF 中,把IM协议划分为四种协议,即即时信息和出席协议(Instant Messaging