Swift面向协议编程技术细节与工程演练解读.pptx

Swift面向协议编程技术细节与工程演练解读.pptx

  1. 1、本文档共79页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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中的演示。 协议扩展初探 ?

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档