博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS - Swift 面向协议编程(一)
阅读量:6676 次
发布时间:2019-06-25

本文共 1421 字,大约阅读时间需要 4 分钟。

OC无法做到面向协议开发,而Swift可以,因为Swift可以做到协议方法的具体实现,而OC不行

面向对象开发

传统的面向对象开发思维方式是将类中实现的相似方法抽取出来,接着放入一个Base类,然后继承于Base类后各个类即可找拥有相同的方法,不用再一个个手动实现。

比如:一个Person类,一个Dog类,它们都拥有方法eat,那么就可以新建一个Animal类,将eat方法抽取出来放入其中,然后将Person类和Dog类都继承于Animal。
但是,如果现在又有一个Robot类,也需要拥有eat方法,而此时也将其继承于Animal的话显然是不合理的,于是我们就需要转换思维,面向协议开发~

面向协议开发

面向协议开发的核心是: 模块化(组件化)

我们先来回顾下协议的一般使用,新建一个Swift文件LXFProtocol.swift

import Foundationprotocol LXFProtocol {    func eat()}复制代码

我们的Person类遵守协议LXFProtocol,需要我们实现协议中的方法,如:

class Person: NSObject, LXFProtocol {    func eat() {        //    }}复制代码

那我们每个类都这样做的话跟直接复制粘贴代码并没什么不同~~

而开头已经提到一点:

Swift可以做到协议方法的具体实现

那么现在,我们新建一个Swift文件Eatable.swift,以区分LXFProtocol.swift

Eatable.swift中的代码实现如下:

import Foundationprotocol Eatable {    // 可声明变量}extension Eatable {    func eat() {        // 实现具体的功能    }}复制代码

有2个注意点

  • protocol中可以声明变量,方便在协议方法中使用
  • 协议方法的具体实现需要在extension中来实现

使Dog类遵守Eatable

class Dog: NSObject, Eatable {}复制代码

这样我们就可以在其它地方轻松调用dog的eat方法,Person类与Robot类也是如法炮制

至此,我们就可以通过面向协议的方式给类定制不同的功能,也就是模块化。可以发现Swift的面向协议编程跟c++的多继承很相似

约束

现在的这个Eatable协议是可以被任意遵守的,如果我们有这么个需求,我们创建的协议只是被UIViewController遵守,那我们该怎么做呢?

【当然,Eatable协议只能被UIViewController遵守很扯淡,这里只是举例,不要太在意咯~~】

在 extension 后面加上约束关键字【where】,并注明该协议只能被UIViewController这个类(包括子类)所遵守,而且此时我们还可以拿到遵守该协议的控制器的view

//import Foundationimport UIKitprotocol Eatable {}extension Eatable where Self : UIViewController {    func eat() {        view.backgroundColor = UIColor.red    }}复制代码

接下来以一个实际应用来巩固下吧

转载地址:http://yagxo.baihongyu.com/

你可能感兴趣的文章
linux文件系统 - 初始化(二)
查看>>
Python的可视化图表工具集
查看>>
《条目二十九:对于逐个字符的输入请考虑istreambuf_iterator》
查看>>
Python的优点与功能
查看>>
sed实例精解--例说sed完整版
查看>>
apache安装mod_ssl.so 出现 undefined symbol: ssl_cmd_SSLPassPhraseDialog错误解决
查看>>
概念,
查看>>
招财铃,负责模块,
查看>>
三个文件,
查看>>
webpack的总结
查看>>
hibernate 一级缓存和二级缓存
查看>>
HDU1576 A/B,模拟元
查看>>
javac不是内部或外部命令
查看>>
easuyi datatox 选择年月
查看>>
C++中使用多线程
查看>>
mvc SelectList selected失效的解决方法
查看>>
JAVA 设计模式 中介者模式
查看>>
caffe环境配置2
查看>>
我的软件工程课目标
查看>>
var a={n:1}; var b=a; a.x=a={n:2}; console.log(a.x); console.log(b.x);
查看>>