zoukankan      html  css  js  c++  java
  • 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;
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    SLA合规率是什么? SLA合规率实践分析
    如何借助Site24x7提高Azure VM的灵活性和效率?
    如何避免LLMNR / NBT-NS欺骗攻击?
    ITSM整治混乱秩序 | 看知名研究所如何解决帮助台管理
    如何使用Applications Manager轻松监控Nginx?
    vue中让input框自动聚焦
    pc端手机号填写与验证信息的样式
    vuex里面的this.$store.dispatch 和 this.$store.commit用法以及区别
    Vue 的状态管理工具 Vuex(Vuex的安装与使用)
    详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
  • 原文地址:https://www.cnblogs.com/zhaochaobin/p/5236730.html
Copyright © 2011-2022 走看看