• OC-类目延展协议


    类目(Category)

    延展(Extension)

    协议(Protocol)

    一.类目

    OC语言中的类目机制只有一个作用:为任何一个类添加方法

    注意:

    1.不能在分类中添加属性,只能添加方法
    2.如果再分类里面使用@property,那么它只能生成getter和setter的声明,没有实现
    3.如在在分类中写了与本类同名的方法,优先调用分类里面的方法,所以在分类中定义类的时候,尽量避免和本类中的方法重名
    4.在分类里面可以访问本类里面所定义的属性
    我们为NSString类添加一个方法,实现字符串的翻转,NSString中没有实现字符串翻转的方法,所以类目就很重要了
    代码如下:

    #import <Foundation/Foundation.h>

    @interface NSString (Overturn)

    -(NSString *)overturn;

    @end

    #import "NSString+Overturn.h"

    @implementation NSString (Overturn)

    //实现字符串的翻转

    -(NSString *)overturn

    {

        NSMutableString *str=[NSMutableString string];

        for(int i = (int)self.length; i >=0; i--)

        {

            char c = [self characterAtIndex:i-1];

            [str appendFormat:@"%c",c];

        }

        return str;

    }

    @end

    #import <Foundation/Foundation.h>

    #import "NSString+Overturn.h"

    #import "NSString+Cate.h"

    int main(int argc, const char * argv[]) {

        @autoreleasepool {

            NSString *str=@"abcd";

            NSString *str1=[str overturn];

            NSLog(@"%@",str1);

            

            NSNumber *num=[str lengthAsString];

            NSLog(@"%@",num);

               }

        return 0;

    }

     
     
    二,延展
         延展可以看作是一种匿名的类目,类有时需要一些只为自己所见,所用的私有方法这种私有方法可以通过延展的方式来声明。
         
    为类创建了私有方法,实现一对多
    1个.m对应多个.h文件
    就是说一个类的 .m文件可以有多个延展的.h文件
     
    延展可以进行成员变量,属性,方法的各种操作
     
    延展文件MyClass_add.h

    #import "MyClass.h"

    @interface MyClass ()
    -(void)add;
    @end
     
    类文件:Myclass.h
    #import <Foundation/Foundation.h>

    @interface MyClass : NSObject
    -(void)select;
    @end
     
    Myclass.m
     
    #import "MyClass.h"
    @implementation MyClass
    -(void)select{
        NSLog(@"%s",__func__);
    }
    -(void)add{
        NSLog(@"%s",__func__);
    }
    @end
     
     
    主函数 main.m
     
    #import <Foundation/Foundation.h>
    #import "MyClass.h"
    //到导入延展的头文件
    #import "MyClass_add.h"

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            MyClass *class=[[MyClass alloc]init];
            [class select];
            [class add];
       
        }
        return 0;
    }
     
     三.协议

          OC中的协议为一组方法的声明。不需要实现。遵守协议的类负责实现协议中的方法。

    协议使用@protocol关键字进行声明。

    其声明的方法中分为必须实现的方法和可选实现的方法。分别用@required@optional关键字标示。

    如果不写默认为必须实现的方法

    协议只有方法的声明(类似于其他编程语言的接口)
     
    协议相当于大家都所遵循的
    关键字 @protocol 协议名 <所遵循的协议> 默认NSObject
     
    @end
     
     
    @protocol lamcoProtocol <NSObject>
    @required  //必须实现的方法
    -(void)study;

    @optional  //可实现可不实现的方法
    -(void)work;
    @end
     
    student.h文件
    #import <Foundation/Foundation.h>
    #import "lamcoProtocol.h"
    @interface Studeny : NSObject<lamcoProtocol,bank>
    @end
     
     
    student.m文件
    #import "Studeny.h"
    @implementation Studeny
    -(void)study{
        NSLog(@"%s",__func__);
    }
    //-(void)work{
    //    NSLog(@"%s",__func__);
    //}
    @end
     
    主函数:
    #import <Foundation/Foundation.h>
    #import "Studeny.h"
    #import "OtherStudent.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Studeny *stu=[[Studeny alloc]init];
           
    //        [stu study];
            //判断其是否遵循协议
            if ([stu conformsToProtocol:@protocol(lamcoProtocol)]) {
                //判断协议是否有该方法
                if([stu respondsToSelector:@selector(study)]){
                    [stu study];
    //                [stu work];
                }else{
                    NSLog(@"找不到好工作");
                }
            }else{
                NSLog(@"没有参加培训");
            }
           
            if([stu conformsToProtocol:@protocol(lamcoProtocol)]){
                if ([stu respondsToSelector:@selector(giveMoney)]) {
                    NSLog(@"每月还钱");
                }else{
                    NSLog(@"成为黑户");
                }
            }else{
                NSLog(@"不关事");
            }
           
           
           
        }
        return 0;
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Django 框架 # 51
    Django 框架 介绍# 51
    前端之Bootstrap框架 # 50
    phpcms调用一个指定的栏目的url和栏目名称
    phpcms导航栏调用二级栏目
    彻底弄懂JS的事件冒泡和事件捕获
    toggle 方法的使用
    关于内层DIV设置margin-top不起作用的解决方案
    phpmyadmin导入数据库大小限制修改
    phpcms v9 的表单向导功能的使用方法
  • 原文地址:https://www.cnblogs.com/zhaochaobin/p/5236730.html
Copyright © 2020-2023  润新知