Sian 发表于 2014-3-18 09:25:35

使用Category扩展NSString的功能

本帖最后由 Sian 于 2014-3-18 09:27 编辑

1、Category以下称为分类
2、分类不同于继承或包含,分类与主类相当于兄弟关系,是主类方法的一个扩展;
3、分类的命名规范:
   文件名在主类的文件名后加分类名称,即(主类+分类.h),其中"+"为文件名的一部分;
   类的声明与实现都与主类极其类似,只在主类外后加"(分别名)",即@interface 主类名 (分类名),注意这里不需要写继承关系;
4、分类做为主类方法的一个扩展,不能扩展主类的成员变量;

以一个示例来说明一下:
扩展NSString类功能,通过分类增加一个能计算字符串中数字个数的方法

NSString+Number.h
//
//NSString+Number.h
//Category-1
//
//Created by yusian on 14-3-18.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>

// 创建一个类的Category,声明与主类格式一致,在外面加(分类名称),分类的文件命名为"主类名+分类别.h"
@interface NSString (Number)

// 增加分类方法,注意分类中不能增加成员变量,并且不建议与主类中方法重名(分类方法优先级高于主类,因此会覆盖主类的方法)
+ (short)numberCountOfString:(NSString *)str;

@end



NSString+Number.m
//
//NSString+Number.m
//Category-1
//
//Created by yusian on 14-3-18.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import "NSString+Number.h"

// 分类实现部分同样与主类的实现部分类似,唯一不同的是后面加"(分类名)";
@implementation NSString (Number)

// 一个计算字符串中数字个数的类方法,由于系统定义的NSString中没有该方法,所以我们通过这种方式扩充功能
+ (short)numberCountOfString:(NSString *)str
{

    // 定义一个临时变量做为返回值,并赋初值,否则值随机;
    short count = 0;
   
    // 通过for循环来遍历字符串中的每一个字符
    for (int i = 0; i < str.length; i++) {
   
      // NSString提供了取字符串字符的系统方法"- (unichar)characterAtIndex:(NSUInteger)index;"直接调用返回字符
      unichar c = ;
      
      // 对返回的字符进行判断,该字符是否为数字
      if ( c >= '0' && c <= '9') {
      
            // 如果为数字计算器加1
            count++;
      
      }

    }
   
    // 返回最终计算器的值即为数字个数,为节约空间,函数返回值类型为short int,即2个字节;即最大表示可到2^15-1,应该够用了
    return count;
}

@end



main.m
//
//main.m
//Category-1
//
//Created by yusian on 14-3-18.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>
// 注意要包含分类的头文件,否则分类未声明,无法使用
#import "NSString+Number.h"

int main()
{
   
    // 创建一个字符串对象,并赋值
    NSString * str = @"yusian.com-2013-12-20";
   
    // 定义一个short类型数据来保存分类方法返回的结果值
    short num = ;
   
    // 打印输出
    NSLog(@"The number count of %@ is %d", str, num);

    return 0;
}



运行结果:
2014-03-18 09:04:26.273 Category-1 The number count of yusian.com-2013-12-20 is 8Program ended with exit code: 0


Sian 发表于 2014-3-18 09:35:10

本帖最后由 Sian 于 2014-3-18 09:46 编辑

以上是通过类方法实现,其实还可以通过对象方法一样的可以实现,参考代码如下:
- (short)numberCount
{

    int count = 0;
   
    for (int i = 0; i < self.length; i++) {
   
      unichar c = ;
      
      if ( c >= '0' && c <= '9') {
      
            count++;
            
      }
   
    }
   
    return count;

    // 或者通过调用类方法实现
    // return ;
}


同样的道理,类方法也可以通过调用对象方法来实现,只需一句代码:
return ;
两者可以相互转换,但不能同时调用对方,会进入死循环!
页: [1]
查看完整版本: 使用Category扩展NSString的功能