zoukankan      html  css  js  c++  java
  • Objective-C 类别(category)和扩展(Extension)

    1、类别(category)

    使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到,这点和javascript中使用原型来定义属性有点类似。

    我们可以为一个类创建一个新的方法,而不需要在代码中编辑类定义。

    下面就是定义并使用分类的例子程序,通过下面代码,我们可以给Object-C中的NSString 添加camelCaseString分类,使用camelCaseString方法,就可以去掉一个字符串中的空格,并将原有空格后的单词改写成大写(即将字符串转化为驼峰式)。

    #import <Foundation/Foundation.h>
    
    /*
    定义分类的过程大致可分为以下几个步骤:
    	第一步、创建一个带有接口的新文件,即创建已有类
     
    	第二步、在新文件中添加需要扩展的方法及方法的实现,即需要添加的分类
     */
    //NSString 表示将要添加分类的类名称,该类必须是已存在的。
    //CamelCase 是为类添加的方法名称。
    //只能添加方法,不能添加变量。
    //头文件命名惯例:ClassName+CategoryName.h
    @interface NSString (CamelCase)
    
    -(NSString*) camelCaseString;
    
    @end
    
    @implementation NSString (CamelCase)
    
    -(NSString*) camelCaseString
    {
        //调用NSString的内部方法获取驼峰字符串。
        //self指向被添加分类的类。
        NSString *castr = [self capitalizedString];
    	
        //创建数组来过滤掉空格, 通过分隔符对字符进行组合。
        NSArray *array = [castr componentsSeparatedByCharactersInSet:
                          [NSCharacterSet whitespaceCharacterSet]];
    	
        //把数组的字符输出
        NSString *output = @"";
        for(NSString *word in array)
        {
            output = [output stringByAppendingString:word];
        }
    	
        return output;
    	
    }
    
    @end
    int main (int argc, const char * argv[])
    {
    	
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    	
        NSString *str = @"My name is bill.";
        NSLog(@"%@", str);
        str = [str camelCaseString];
        NSLog(@"%@", str);
    	
        [pool drain];
        return 0;
    }
    

      

    2、扩展(Extension)

    你可以这样理解:扩展就是匿名分类,下面是一个扩展的例子:

    @interface MyClass : NSObject
    - (float)value;
    @end
     
     
    @interface MyClass () { //注意此处:扩展
        float value;
    }
    - (void)setValue:(float)newValue;
    @end
     
    @implementation MyClass
     
    - (float)value {
        return value;
    }
     
    - (void)setValue:(float)newValue {
        value = newValue;
    }
     
    @end
    

      

  • 相关阅读:
    MIN (Transact-SQL)【转】
    ROW_NUMBER() OVER函数的基本用法用法【转】
    读取文件中的内容
    Stopwatch 和TimeSpan介绍【转】
    TimeSpan类【转】
    Stopwatch 类【转】
    ToString()使用方法
    用c#读取文件内容中文是乱码的解决方法:
    vue实现购物车和地址选配(二)
    vue实现购物车和地址选配
  • 原文地址:https://www.cnblogs.com/lm3515/p/3339210.html
Copyright © 2011-2022 走看看