iOS APP 开发 OC 第二十二天,Portocol

tags: OC 30 day

什麽是Protocol?

作用:专门用来声明一大堆方法。(不能声明属性,也不能实现方法,只能用来写方法的声明)。只要某个类遵守了这个portocol。就相当於拥有这个portocol中的所有的方法声明。
如上图,只要某个类遵守了这个portocol,就相当於拥有了这个portocol的所以方法声明,而不用自己去定义。

portocol 声明

@protocol portocol名称 <NSObject>

methods声明

@end

新增一个portocol的方式。NewFile OC-File-protoco portocol的文件名: .h 并且只有一个 .h 文件。

在portocol的文件中,只能用来声明方法,portocol的作用:就是专门用来写方法声明的。

类遵守portocol

portocol是用写方法声明的,就是用来被类遵守的。

如果想要让一个类,拥有portocol中定义的所有的方法声明,那麽就让这个类遵守这个portocol。
类只要遵守一个portocol,那麽这个类就拥有了这些portocol中定义的所以的方法的声明了。

这个类只是拥有了这个portocol中的方法声明尔以。没有实现。所以这个类,就应该匙实现portocol中的方法。

类是单继承,但是portocol可以多个遵守

一个类只能有一个父类
但是一个类可以同时遵守多个portocol。

@interface 类名:父类名 <protocol1,portocol2>
@end

当一个类遵守了多个portocol之後,就相当於这个类拥有了所有portocol中定义的方法声明。那麽这个类,就应该实现所有portocol中的方法。

如果不实现,其实也不会报错,编译器只是会报警告。
但是当创建对象,来调用这个没有实现的portocol中的方法的时候,就会报错。

当一个类遵循portocol时,有的只有方法的声明,没有实现。要类自己去实现。

当一个类遵守了多个portocol之後,就相当於这个类拥有了所有portocol中定义的方法声明。但是仅仅只是有方法的声明而已,没有实现,要类自己去实现。

如果不实现,其实也不会报错,编译器只是会报警告。
但是当创建对象,来调用这个没有实现的portocol中的方法的时候,就会报错。

当一个类遵守了多个portocol之後,就相当於这个类拥有了所有portocol中定义的方法声明。也不会报错,只是给一个警告。

@requird 与 @optional

这两个修饰符是专门用来修饰portocol的方法。

@requird

在portocol中,如果方法的声明被@required修饰,那麽遵守这个portocol的类必须要实现这个方法,否则编译器会发出警告。

@optional

在portocol中,如果方法的声明被@optional修饰,那麽遵守这个portocol的类可以实现这个方法,也可以不实现这个方法,不实现编译器也不会发出警告。

其实,无论是@required还是@optional你都可以不实现。编译器是不会报错的,仍然可以编译执行。唯一的区别是:当遵守portocol的类不实现portocol中的方法时,@required会给一个警告,@optional没有。
这两个关键字的主要作用在於:工程师的沟通,告诉遵守portocol的类,哪些方法必须要实现,因为这些方法我会调用。

默认的状态为 @required

portocol 与 portocol 之间可以相互继承

继承的语法:

@portocol 名称 <父portocol>
@end

效果:子portocol不但有自己的方法声明,还有父portocol中的所有方法声明。

NSObject

在Foundation框架中,有一个类叫做NSObject是所有OC类的基类。
在Foundation框架中,有一个Portocol,叫做NSObject

NSObject portocol 都被 NSObject 类遵守,所以NSObject portocol中的所有方法全部的OC类都有了,这麽说。所有的OC类都遵守了NSObject portocol。NSObject portocol叫做基协议

类的名称可以跟portocol的名称一致。

写Portocol的规范

要求所有的portocol都必须要直接或是间接的从NSObject基协议继承。


<<:  安全框架和成熟度模型(Security Frameworks and Maturity Models)

>>:  [DAY16]跟 Vue.js 认识的30天 - Vue 过渡(转场)及动画效果上篇(`<transition>`)

[分享] verilog设计经验总结

先记下来: 1、不使用初始化语句; 2、不使用延时语句; 3、不使用循环次数不确定的语句,如:for...

[Python]如何Speech to Text: SpeechRecognition

https://pypi.org/project/SpeechRecognition/ pip3 i...

#7 JavaScript Modules

今天来介绍 JavaScript 的模组 esm 系统及 commonjs 系统。 什麽是模组 当我...

Angular#2 专案:新增 与 启动

Angular 1. 新增专案 ng new [project-name] 范例ng new sys...

Day_22: 让 Vite 来开启你的Vue 之 跨元件响应式资料的处理

Hi Dai Gei Ho~ 我是 Winnie ~ 在今天文章中,我们要来继续延伸 昨天文章的主题...