- 1、本文档共79页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Swift面向协议编程技术细节与工程演练解读
Swift面向协议编程技术细节与工程
演练
面向协议编程之前的协议
? OCSwift2.0版本之前,协议是没有实现的
,协议的用法大致就是:delegate、
datasource。
? 比如最常用的“点赞”功能,在cell上放置按
钮,覆盖cell的用户响应、保留按钮的用户
响应。
? 用户点击按钮后需要修改数据源的状态。
面向协议编程之前的协议
? 按钮的定义在cell的子类中,IBAction也在定
义在cell的子类中,而数据源却在Controller
的子类中。
? 需要解决的问题是:如何把按钮的点击事件
传递给Controller的子类。
? 写一个delegate协议,请看工程演示。
面向协议编程之前的协议
? 让我们来分解一下上面的操作:
? 1.声明一个Deleagte协议,这个协议可能只用到一次
? 2.在cell中定义可选型类型的属性,把1中定义的协议
作为类型使用。
? 3.Controller子类遵循自定义的Delegate协议,并定义具
体实现。
? 4.在获得每个Cell的实例的时候,指定实例的delegate
属性为Controller,实现绑定。
面向协议编程之前的协议
? 更加Swift化的方案:使用闭包替代协议。
? 请看工程演示。
面向协议编程之前的协议
? 使用闭包的步骤分解:
? 1.向定义其他类型的属性一样,定义一个闭
包并定义初始值(一般都是空操作)。
? 2.在controller子类中为闭包属性重新赋值。
面向协议编程之前的协议
? 在Swift中闭包(当然还有函数和方法)是“
一级公民”,补充一些闭包的知识。
? 使用闭包的好处:
1.步骤更简单,可读性强
2.代码耦合度更高,避免跨越代码,增加无意义的
理解成本
面向协议编程之前的协议
? 使用闭包的注意事项:
?
?
闭包和类一样,也是引用类型的,会持有内部的对象,所以有“循环引
用”的风险。在示例中使用了“捕获列表”来避免“循环引用”。不过不需
要太过担心,苹果的官方文档中有说明,闭包只在特定情况下才有出
现“循环引用”的风险。
方法中的闭包参数不会出现“循环引用”的风险。需要注意的是,如果
方法体中有循环调用某个闭包参数的代码,经常在参数列表中为闭包
参数加上@noescape关键字。@noescape的主要目的是避免在循环中不
断引用相同的闭包,提升内存利用率。标准库中CollectionType协议中
的map、filter等常用的方法都是基于@noescape的。
面向协议编程之前的协议
? 捕获列表是API的使用者在使用时添加的,
使用者需要明确“循环引用”的触发条件,避
免添加无意义的关键字。
? @noescape是API的开发者在定义时加入的,
在使用闭包时{}中不会要求加入self关键字,
API的使用者可以不用关心@noescape。
面向协议编程之前的协议
? 来明确一下“循环引用”风险的触发条件。
? 方法和函数都是以“名称”为第一标识符的,然后是参
数类型和返回值类型,作为一门强类型语言,参数
类型和返回值类型同时适用于方法重载。而闭包是
匿名的,如示例中所示,闭包单独使用时,需要作
为一个常量或者变量的类型使用,因此闭包自然而
然会成为某个数据类型的成员。如果持有闭包的是
类,那么会有“循环引用”的风险。这种情况需要特别
注意。
面向协议编程之前的协议
? 闭包作为方法参数时不会出现循环引用。
Swift中的方法的实现方式很有趣,无论是类
型方法还是实例方法。闭包作为参数不会发
生循环引用是因为方法本身并不属于某个数
据结构,实例方法、构造器的实现机制是基
于“柯里化”的。
面向协议编程之前的协议
? “柯里化”是什么?
? “柯里化”的方法都有多组参数列表,每传入
一组参数,都会返回剩下的参数列表与返回
值所组成的新函数。
? 请看playground演示。
面向协议编程之前的协议
? 结论:Swift的方法、构造器不是保存在数据结构
中的,数据结构为定义在它内部的每个方法(无
论是类型方法还是实例方法)定义了命名空间。
调用方法的实例其实是这个命名空间中的方法的
第一组参数,闭包是第二组参数列表中的参数,
所以二者是平级的,不存在持有关系,因此即便
在尾随闭包中使用了self中的内容,也不会发生“循
环引用”。
面向协议编程之前的协议
? Swift中的闭包合理地接管了delegate的职责
,此时协议的定义有点尴尬了。直到
Swift2.0中协议扩展的引入。
? 首先来看个简单的例子,感受一下Swift2.0
之后标准库中的协议扩展。
? 请看playground中的演示。
协议扩展初探
?
您可能关注的文档
最近下载
- 冠状动脉介入治疗考试试题及答案.docx
- GZ036 区块链技术应用赛项赛题-2023年全国职业院校技能大赛拟设赛项赛题完整版(10套).docx
- 8.网络新世界(教学设计)-四年级道德与法治上册(部编版).docx
- 现代遗传学(厦大)中国大学MOOC慕课 章节测验期中期末考试答案.docx
- 心肺运动试验的临床研究及应用PPT课件.ppt
- 谷胱甘肽还原酶(GR)及其临床意义.pdf VIP
- 系统硬件集成及软硬件联合调试方案.docx VIP
- 部编版语文四年级上册 第五六单元测试卷(含答案).pdf
- 高中化学《信息技术与学科整合的教学设计》《苯芳香烃》.pdf VIP
- 直播销售 项目7 直播话术设计.pdf
文档评论(0)