Mixins and Traits in Swift 2.0

设计模式kelby • 于 2015-10-04 05:06:12 +0800 • 1153 阅读

原文链接 Mixins and Traits in Swift 2.0 本文并非翻译,只是做简述。


文章主要由 7 部分组成。

快速介绍

作者在这里声明了一个 protocol Hello,里面只有一个空方法。之后,MyClass 遵行于它,并实现了方法。这就是最简单的例子。

另,作者还讲解了:对象也可以遵行某个“协议”,相对于普通的对象,它会受到更多的限制。

协议扩展

声明(protocol)一个协议后,你可以以扩展(extension)的形式实现它里面的方法。

类遵行协议之后,可以直接调用方法。也可以自己重新实现此方法,但这不同于重写父类方法。所以,你不必使用 override,也不能使用 super

单继承有很多不足之处,多继承又会有更多问题(所以,Swift 不提供),折中方法是单继承 + 糅合。

糅合 vs 继承

继承在 OOP 里很好,它能够使得类型清晰明了,类与类之间结构清楚。

但实际工作中,我们同样能够发现它的不足,那就是理想和现实不符,需要我们变通。

拿 UIKit 举例,这种情况下,继承树很漂亮。
再拿“战棋类”游戏举例,这种情况下,就会发现单继承有很多问题,这就是它的不足之处。

“糅合”,参与了 Ruby 里对 mix-in 的翻译,因为在这里虽然语言不同,但意思是相通的。

interface, trait, mixin

作者简述,自己认为: interface, trait, mixin 三者之间的联系与区别。

1)只定义方法,不能实现。协议的普通用法。
2)不仅定义方法,还能实现。协议的高级用法。 3)不仅定义方法,还能实现,还能有状态(属性)。(可以声明属性,要类去赋值;作者YY出来的用法)

示例: 登录时校验

你要做一个登录功能,在发送数据到服务器之前要对用户名 & 密码做校验。

一种方式,你直接在 ViewController 里写检验,但这会使得代码很乱,不能重用,难以维护。
另一种方式,把校验拆分出来,以“类”的形式存在。在 ViewController 里只是做调用。
再另一种方式,把校验拆分出来,做成协议,可以糅合进 ViewController 里。

示例: Ruby Enumerable

在 Ruby 里面,如果你实现了 each() 方法,并且 include Enumerable 则你自动获得了很多操作集合的方法,例如:map(), group_by(), find_all(), drop_if()

在 Swift 里,我们用协议同样定义一个 Enumerable,然后扩展实现它。

定义一个 struct 并遵行 Enumerable,检验是否符合预期。

示例:扩展标准库 GeneratorType

哦~~,这里,就是各种玩。

1)“protocol”定义协议
2)“extension”实现协议
3)“糅合”遵行协议,各种玩

本文内容丰富,作者幸苦了。

回复: 0
暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,见 Emoji cheat sheet
  • @name 会链接到用户页面,并会通知他
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
Ctrl+Enter