iOS - Swift 面向协议编程(一)

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

面向对象开发

传统的面向对象开发思维方式是将类中实现的相似方法抽取出来,接着放入一个Base类,然后继承于Base类后各个类即可找拥有相同的方法,不用再一个个手动实现。 比如:一个Person类,一个Dog类,它们都拥有方法eat,那么就可以新建一个Animal类,将eat方法抽取出来放入其中,然后将Person类和Dog类都继承于Animal。 但是,如果现在又有一个Robot类,也需要拥有eat方法,而此时也将其继承于Animal的话显然是不合理的,于是我们就需要转换思维,面向协议开发~

面向协议开发

面向协议开发的核心是:** 模块化(组件化) ** 我们先来回顾下协议的一般使用,新建一个Swift文件LXFProtocol.swift

import Foundation

protocol LXFProtocol {
    func eat()
}

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

class Person: NSObject, LXFProtocol {
    func eat() {
        //
    }
}

那我们每个类都这样做的话跟直接复制粘贴代码并没什么不同~~ 而开头已经提到一点:

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

�那么现在,我们新建一个Swift文件Eatable.swift,以区分LXFProtocol.swift Eatable.swift中的代码实现如下:

import Foundation

protocol 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 Foundation
import UIKit

protocol Eatable {
    
}

extension Eatable where Self : UIViewController {
    func eat() {
        view.backgroundColor = UIColor.red
    }
}

Demo 接下来以一个实际应用来巩固下吧 iOS - Swift 面向协议编程(二)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏求索之路

Effective Java笔记(不含反序列化、并发、注解和枚举)

最近把Effective Java复习了一遍,其中有比较多的java最佳实践可以在平时编程中用到。反序列化、并发、注解和枚举这四章没看,并发这本书里讲的比较简...

33611
来自专栏Java进阶之路

Java中关于String类型的10个问题

1370
来自专栏积累沉淀

JavaScript事件

JavaScript事件 对于事件来讲,首先,我们需要了解这样几个概念:事件;事件处理程序;事件类型;事件流;事件冒泡;事件捕获;事件对象;事件模拟,事件方面的...

2076
来自专栏一枝花算不算浪漫

[Java面试二]Java基础知识精华部分.

3589
来自专栏情情说

深入浅出MyBatis:反射和动态代理

前三篇详细总结了Mybatis的基本特性、常用配置、映射器,相对于Hibernate,映射器的配置相对复杂,但有很好的灵活性和扩展性,可以应对各种业务场景。熟练...

3907
来自专栏python学习指南

Java面试题问与答——编译时与运行时

在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问...

1899
来自专栏我的技术专栏

漫谈C++:良好的编程习惯与编程要点

987
来自专栏大内老A

比较一下以“反射”和“表达式”执行方法的性能差异

由于频繁地使用反射会影响性能,所以ASP.NET MVC采用了表达式树的方式来执行目标Action方法。具体来说,ASP.NET MVC会构建一个表达式来体现针...

1717
来自专栏青枫的专栏

java基础学习_面向对象(下)03_day10总结

============================================================================= ==...

511
来自专栏Java架构师学习

为Java程序员金三银四精心挑选的五十道面试题与答案

1、面向对象的特征有哪些方面? 【基础】 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地...

3406

扫码关注云+社区