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 条评论
登录 后参与评论

相关文章

来自专栏owent

小记最近踩得两个C++坑

记一下最近踩得两个C++独有的暗坑,其中一个和ABI相关。第二个坑其实之前研究过,但是没有实例,这次算是碰到了个典型的实例。

802
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常 —— 工作一天的收获

看题目可能是扯皮,其实还是有很多专业知识的。从最开始没有注意到设计原则,到后面的jquery实战技巧,都是今天一天碰到的问题。 每天整理一点点,每天收获一点...

2197
来自专栏24K纯开源

Android Studio快捷键每日一练(6)

51、重构代码 苹果:Ctrl+T    Windows:Ctrl+Alt+Shift+T 该快捷键会根据当前上下文环境,针对所选择的代码给出重构选项列表。这个...

20910
来自专栏码代码的陈同学

Java基础之SPI机制

在前几天的译文 Java中的类加载器 中有部分关于ContextClassLoader的内容,涉及到SPI机制,本文将学习下相关知识。

1022
来自专栏机器之心

资源 | 简单快捷的数据处理,数据科学需要注意的命令行

1545
来自专栏青玉伏案

关于Simple_html_dom的小应用

  今天一同学给我推荐了本书,说是刚出不久,内容还不错,是心灵鸡汤类的书,于是按捺不住就像在网上下一本,可是木有资源肿么办。只有在线看的,作为一个准码农,所以甭...

2037
来自专栏JetpropelledSnake

Linux学习笔记之Redis中5种数据结构的使用场景介绍

原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码。目前目标是吃透 redis 的数据结构。我们都知...

991
来自专栏顶级程序员

分享史上Java最牛逼,最简短的代码

转自:最代码 确实是12306的最核心代码呀 <script> alert("当前访问用户过多,请稍后重试!"); </script> 确实牛 pub...

3347
来自专栏逍遥剑客的游戏开发

Ogitor代码分析

1182
来自专栏有趣的django

PYTHON面试

大部分的面试问题,有最近要找事的老铁吗?  python语法以及其他基础部分 可变与不可变类型;  浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来...

4667

扫码关注云+社区