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

相关文章

来自专栏青玉伏案

设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

今天是五.四青年节,祝大家节日快乐。看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火。这两道菜大部分人都应该吃过,特别是醋溜土豆丝,...

18090
来自专栏拂晓风起

node.js模块化写法入门

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

Ogitor代码分析

14020
来自专栏程序员的诗和远方

异步多图加载这件小事儿(Promise与async)

日常开发过程中,时不时会遇到要同时预加载几张图片,并且等都加载完再干活的情况,结合 Promise 和 async/await 代码会优雅很多,但也容易遇到坑,...

36880
来自专栏Java3y

【Java】几道让你拿offer的面试题

之前在刷博客的时候,发现一些写得比较好的博客都会默默收藏起来。最近在查阅补漏,有的知识点比较重要的,但是在之前的博客中还没有写到,于是趁着闲整理一下。

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

Java基础之SPI机制

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

15420
来自专栏游戏开发那些事

【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术

  数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告...

10010
来自专栏顶级程序员

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

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

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

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

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

31370
来自专栏JetpropelledSnake

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

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

12710

扫码关注云+社区

领取腾讯云代金券