对iOS的代码与架构的思考--协议篇

本文探讨了iOS开发中协议和继承的应用,通过实例说明如何利用协议进行组件扩展,避免代码耦合,同时讨论了正确使用继承的原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、关于协议的思考

协议,就是一个方法列表,它声明了可以被任意类实现的方法。换句话来说,就是所有的对象,只要遵循了该协议,则拥有了这个方法列表的方法的声明即对外的接口。

注:在iOS当中,协议经常与代理委托结合使用,但是,这两者之间不要混为一谈。

使用协议,可以给大家提供一种编写组件的思路,能让我们对项目的耦合性加深认识,先举一个例子.


/**
 定义一套协议列表
 */
@protocol LBEmptyDataProtocol

- (void)lb_setEmptyNoData:(NSAttributedString *)title;
- (void)lb_setEmptyNoData:(NSAttributedString *)title
                    block:(LBEmptyDataBlock)block;
- (void)lb_setCustomView:(__kindof UIView *)customView;
- (void)lb_removeEmptyData;

@end


/**
 让这个分类去实现这个协议,从而获得了接口
 */
@interface UIScrollView (LBEmptyData) <LBEmptyDataProtocol>

@end

// 功能的定制
@implementation UIScrollView (LBEmptyData)

- (void)lb_setEmptyNoData:(NSAttributedString *)title block:(LBEmptyDataBlock)block {
    // ...
}
@end

// 其他类的功能补充与扩展.
@implementation UIView (LBEmptyData)

- (void)lb_setEmptyNoData:(NSAttributedString *)title block:(LBEmptyDataBlock)block {
    // 不同的实现逻辑
}
@end

可以运用这个协议,很方便的对我们的组件进行扩展(这里是针对分类进行的扩展)。这样的扩展,可以让不同实现的功能逻辑,保留相同的对外接口,是可以对组件进行拓展,而不会污染原来的代码、也不会引起已有功能逻辑产生改变的一种实现方式。

这里写图片描述

组件写完自然是要做成Spec私有库的,方便自己或者别人进行维护;而关于协议的其他东西, 这里就不啰嗦了,网上有太多的讲解了。

二、关于继承与协议的思考

继承是面向对象的三大特性之一(其实读书是真的有用,书本的概念能得到的转化,是十分收益的),我们在写代码的时候,它能发挥快速开发的巨大作用。但是不加以思考,乱用继承,将会给项目的扩展带来耦合灾难。

我们在使用继承的时候,应该将一下几点考虑在内:

  • 父类作为服务的提供者,不应该参与到子类的业务逻辑,业务逻辑与服务的区分,需要在项目中多多练习;
  • 父类的继承应当考虑2层或2层以上的情况,同一级的逻辑应当处于同一级继承树之中;
  • 父类的改动会引起子类的变化,这种耦合性是必需的,我们需要的是把这种耦合性考虑成制作父类的需求,简单的来说,耦合是一种特征,但它不是贬义的,当耦合变成需求的时候,耦合就不再是缺陷了;

我们常常会使用继承来使得对象能够响应某个函数,举个例子:
我们制作视频聊天有一个开启视频的方法play,调用后会让后台的推送通知响应者接收视频进入聊天室。当业务发生变化,允许一些指定的监标人(观众)观看整个视频直播的过程,这时候开启视频的方法将会不同,使用继承的实现如下:

#import <Foundation/Foundation.h>

@class LBVideoChatMeetingManager;

// 视频会议成员
@interface LBVideoChatMeetingManager : NSObject

- (void)play;

@end

// 视频会议监标人(观众)
@interface LBSupervisorVideoChatMeetingManager : LBVideoChatMeetingManager

@end

但是这两个类对于函数的实现,并没有太多共同的代码,他们所需要的只是具有相同的外部接口而已。这时候使用协议,将是十分合理而准确的做法:

#import <Foundation/Foundation.h>

@class LBVideoChatMeetingManager;

@protocol LBVideoChatMeetingProtocol <NSObject>

- (void)play;

@end

// 视频会议成员
@interface LBVideoChatMeetingManager : NSObject <LBVideoChatMeetingProtocol>

@end

// 视频会议监标人(观众)
@interface LBSupervisorVideoChatMeetingManager : NSObject <LBVideoChatMeetingProtocol>

@end

我们在写代码的时候,不仅要考虑的怎么样快速开发,方便迭代,还养成思考项目架构的习惯,对于iOS架构的思考,还需要不断的前行。。。

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值