美文网首页
非正式协议与正式协议

非正式协议与正式协议

作者: Magic_小杜 | 来源:发表于2017-09-25 17:52 被阅读76次

    在阅读一些技术博客等资料时,经常会出现非正式协议与正式协议的字眼,但是对于它的含义不太清楚,这里提出来说明一下。

    正式协议

    首先我们的正式协议就是指的最常用的那种@protocol的方式来命名的协议方式,主要是配合委托对象来实现代理,就是将多个类共用的方法抽取出来作为一个协议。

    使用场景如下:
    1.定义一个协议

    //GoodStudent.h
    #import <Foundation/Foundation.h>
    @protocol GoodStudent <NSObject>
    //默认是@required
    -(void)goodAtEnglish;
    @end
    
    

    2.声明协议

    //Student.h
    #import <Foundation/Foundation.h>
    #import "GoodStudent.h"
    //注意实现协议的语法。
    @interface Student : NSObject<GoodStudent>
    @end
    

    3.实现协议

    #import "Student.h"
    @implementation Student
    -(id)init 
    {  
      self = [super init];
      if (self) {  
          //初始化代码
      }
      return self;
    }
    -(void)goodAtEnglish
    {   
      NSLog(@"擅长英语。。");
    }
    @end
    

    非正式协议

    非正式协议就是指分类,即凡是NSObject类及其子类的分类,都是非正式协议。相当于一个隐式的协议。

    使用场景如下:

    文件命名方式
    //声明
    #import <Foundation/Foundation.h>
    
    @interface NSArray (log)
    
    - (NSString *)description;
    - (NSString *)descriptionWithLocale:(id)locale;
    
    @end
    
    //实现
    #import "NSArray+log.h"
    
    @implementation NSArray (log)
    //一般的对象以及自定义对象调用该方法
    - (NSString *)description{
        
        NSMutableString *strM = [NSMutableString stringWithString:@"(\n"];
        
        for (NSString *str in self) {
            [strM appendFormat:@"\t%@,\n",str];
        }
        
        [strM appendString:@")"];
        return strM;
        return  @"aaaa";
    }
    
    //NSArray和NSDictionary调用该方法
    - (NSString *)descriptionWithLocale:(id)locale{
        NSMutableString *strM = [NSMutableString stringWithString:@"(\n"];
        
        for (NSString *str in self) {
            [strM appendFormat:@"\t%@,\n",str];
        }
        
        [strM appendString:@")"];
        return strM;
    
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:非正式协议与正式协议

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