iOS协议

作者: DeerRun | 来源:发表于2018-12-12 10:54 被阅读2次

    // 1.协议只能声明方法, 不能声明属性

    #import <Foundation/Foundation.h>
    @protocol SportProtocol <NSObject>
    //{
    //    int  _age;
    //}
    // 方法声明列表
    // 注意: 如果没有使用任何关键字修饰协议中的方法, 那么该方法默认就是required的
    @required
    // 如果协议中的方法是@required的, 而遵守协议的类又没有实现该方法, 那么会报一个警告
    - (void)playFootball;
    @optional // 可选
    // 如果协议中的方法是@optional的, 而遵守协议的类又没有实现该方法, 那么不会报警告
    - (void)playBasketball;
    - (void)playBaseball;
    // 注意:@required和@optional仅仅使用程序员之间交流, 并不能严格的控制某一个遵守该协议的类必须要实现该方法, 因为即便不是实现也不会报错, 只会报一个警告
    @end
    

    // 2.父类遵守了某个协议, 那么子类也会自动遵守这个协议

    @interface Sutdent : Person
    
    @end
    

    // 3.在OC中一个类可以遵守1个或多个协议
    // 注意: OC中的类只能有一个父类, 也就是说OC只有单继承

    @interface Person : NSObject<SportProtocol, StudyProtocol>
    
    @end
    

    // 4.OC中的协议又可以遵守其它协议, 只要一个协议遵守了其它协议, 那么这个协议中就会自动包含其它协议的声明

    @protocol CrazySportProtocol <SportProtocol>
    // 跳楼
    - (void)jumping;
    @end
    

    //5、运用
    //5.1、类型限定

    @interface Person : NSObject
    // 注意: 记住一点, 类型限定是写在数据类型的右边的
    @property (nonatomic, strong) Wife<WifeCondition> *wife;
    - (void)show;
    
    @end
    
    int main(int argc, const char * argv[]) {
    
        Person *p = [Person new];
        // 1.协议的第一个应用场景, 可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那么该对象必须遵守某个协议
        Wife<WifeCondition> *w = [Wife new];
        //Wife *w = [Wife new];
        p.wife = w;
        
        [p show];
        
        return 0;
    }
    
    @interface Wife : NSObject <WifeCondition>
    
    @end
    

    //5.2、代理

    @protocol BabyProtocol <NSObject>
    // 喂婴儿吃东西
    - (void)feedFood:(Baby *)baby;
    
    // 哄婴儿睡觉
    - (void)hongBaby:(Baby *)baby;
    @end
    
    @interface Nanny : NSObject <BabyProtocol>
    
    @end
    
    @implementation Nanny
    - (void)feedFood:(Baby *)baby
    {
        baby.hungry -= 10;
        NSLog(@"喂婴儿吃东西 %i", baby.hungry);
    }
    
    - (void)hongBaby:(Baby *)baby
    {
        baby.sleep += 10;
        NSLog(@"哄婴儿睡觉 %i", baby.sleep);
    }
    @end
    
    /*
     什么是代理设计模式
     心相印和超市
     超市就是心相印的代理, 它可以帮助心相印卖纸巾
     也就是说, 代理也帮助另外一个类做一些事情
     
     代理设计模式的应用场景
     1.当A对象想监听B对象的一些变化时, 可以使用代理设计模式
     保姆想监听婴儿的变化, 那么保姆就可以成为婴儿的代理, 当婴儿发生变化之后保姆就可以监听到
     
     2.当B对象发生一些事情, 想通知A对象的时候, 可以使用代理设计模式
     婴儿想通知保姆, 那么就可以 让保姆成为婴儿的代理, 只要保姆成为婴儿的代理, 以后婴儿发生变化就可以通知保姆
     
     3.当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
     婴儿无法自己吃东西, 也无法自己入睡, 所以可以让保姆帮忙处理. 只要让保姆成为婴儿的代理就可以帮婴儿喂它吃东西和哄他睡觉
     */
    @interface Baby : NSObject
    
    // 饥饿程度
    @property (nonatomic, assign) int hungry;
    // 睡意
    @property (nonatomic, assign) int sleep;
    
    // 吃东西
    - (void)food;
    // 困了
    - (void)sleepy;
    
    // 如果使用id类型来接收保姆, 如果将来换保姆了, 婴儿类不用修改代码
    @property (nonatomic, strong) id<BabyProtocol> nanny;
    
    @end
    
    int main(int argc, const char * argv[]) {
        // 1.创建婴儿
        Baby *b = [Baby new];
        // 2.创建保姆
    //    Nanny *n = [Nanny new];
        // 3.将保姆赋值给婴儿呢
    //    b.nanny = n;
        
        // 4.换保姆
    //    Studnet *stu = [Studnet new];
    //    b.nanny = stu;
        
        // 5.再次换保姆
    //    Teacher *tea = [Teacher new];
    //    b.nanny = tea;
        
        Dog *d = [Dog new];
        b.nanny = d;
        
        //4.婴儿发飙
        [b food];
        [b sleepy];
         
        return 0;
    }
    

    //5.3代理规范

    /*
     协议的编写规范:
     1.一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中
     2.协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate
     3.协议中的方法名称一般以协议的名称protocol之前的作为开头
     4.一般情况下协议中的方法会将触发该协议的对象传递出去
     
     5.一般情况下一个类中的代理属于的名称叫做 delegate
     
     6.当某一个类要成为另外一个类的代理的时候, 
       一般情况下在.h中用@protocol 协议名称;告诉当前类 这是一个协议.
        在.m中用#import真正的导入一个协议的声明
     */
    
    @class Person;
    
    @protocol PersonProtocol <NSObject>
    
    - (void)personFindHourse:(Person *)person;
    
    @end
    
    @interface Person : NSObject
    
    //@property (nonatomic, strong) id<StudentProtocol> delegete;
    @property (nonatomic, strong) id<PersonProtocol> delegate;
    
    - (void)findHourse;
    @end
    

    //6.

    相关文章

      网友评论

        本文标题:iOS协议

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