协议

作者: iOS祎 | 来源:发表于2018-10-30 18:03 被阅读1次

    一 : 简述

    在Java中也有与协议相似的概念,称为接口-interface,是常量与抽象方法的集合.但是在OC中协议-protocol,协议就是是一方法的声明,这些方法可以有选择实现与必须要实现的.

    二 : 协议的定义

    @protocol协议名称

    // 方法声明列表

    @end

    示例

    创建了一个协议,其中有一个必须实现的方法study

    .h
    @protocolStudyProtocol
    - (void)study;
    @end
    

    三 : 遵守协议

    有了协议,那么如何使用这个协议呢,让类遵守协议

    @interface类名 : 父类 <协议名称1, 协议名称2,…>@end

    OC是单继承,但是一个类可以遵守一个或多个协议

    @interfacePerson:NSObject
    @end
    
    @implementationStudent
    // 实现协议方法
    -(void)EatSomting{NSLog(@"%s", __func__);}
    // 实现协议方法
    -(void)study{NSLog(@"%s", __func__);}
    @end
    

    协议和继承的区别:

    1.继承之后默认就有实现, 而protocol只有声明没有实现
    2.相同类型的类可以使用继承, 但是不同类型的类只能使用protocol
    3.protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可

    四 : 协议的使用特点

    1.父类遵守了某个协议,那么子类也自动遵守此协议
    2.父类遵守了此协议

    @interfacePerson:NSObject
    @end
    

    子类自然遵守此协议

    .h
    @interfaceStudent:Person
    @end
    
    .m
    @implementationSutdent
    -(void)study{    }
    @end
    

    协议可以遵守协议

    一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明

    @protocolA
    -(void)methodA;
    @end
    @protocolB
    -(void)methodB;
    @end
    @interfaceTZperson:NSObject
    -(void)methodA;// 同时拥有A/B协议中的方法声明
    -(void)methodB;
    @end
    

    基协议
    每个协议都应该遵守NSObject协议,它是一个基协议,最根本的协议.

    @protocolA// 基协议-(void)methodA;
    @end
    

    required 与 optional关键字

    required: 方法必须要实现,不实现则编译器会发出警告

    optional: 方法不一定要实现

    用于开发者之间的交流

    如果没有使用任何关键字修饰协议中的方法,那么该方法默认就是required的,关键字并不能严格的控制某一个遵守该协议的类必须要实现该方法, 因为即便不是实现也不会报错, 只会报一个警告

    @protocolA
    
    @required
    
    -(void)methodA;
    
    @optional
    
    -(void)methodA;
    
    @end
    

    五 : 类型限定

    定义协议

    @protocolgirlGod
    
    @required
    
    -(void)beatuiful;
    
    @optional
    
    -(void)sexy;
    
    @end
    

    要求某些对象具备上述协议行为,可以将协议写在数据类型的右边,明确的标注如果想给该变量赋值,那么该对象必须遵守某个协议

    id girl = [girl new];
    
    格式 : 数据类型<协议名称> 变量名,和泛型是一个写法

    六 : respondsToSelector

    当某个类遵守了某个协议,但并意味着,它就一定要实现它,因为不实现也不报错.当这个类被实例化,意味着可以调用其遵守的协议方法,但如果没有实现就会报错,所以要使用respondsToSelector进行判断是否实现了某些协议方法

    @protocolwiftPro
    
    -(void)dohouseWork;
    
    -(void)papapa;
    
    @end
    
    @interfacewife:NSObject
    
    if([self.wift respondsToSelector:@selector(dohouseWork)]) 
    {  
        [self.wift papapa]; 
    }
    

    相关文章

      网友评论

        本文标题:协议

        本文链接:https://www.haomeiwen.com/subject/hkxntqtx.html