年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5028|回复: 1

使用Category扩展NSString的功能

[复制链接]
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

    发表于 2014-3-18 09:25:35 | 显示全部楼层 |阅读模式
    本帖最后由 Sian 于 2014-3-18 09:27 编辑

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

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

    NSString+Number.h
    1. //
    2. //  NSString+Number.h
    3. //  Category-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. // 创建一个类的Category,声明与主类格式一致,在外面加(分类名称),分类的文件命名为"主类名+分类别.h"
    10. @interface NSString (Number)
    11. // 增加分类方法,注意分类中不能增加成员变量,并且不建议与主类中方法重名(分类方法优先级高于主类,因此会覆盖主类的方法)
    12. + (short)numberCountOfString:(NSString *)str;
    13. @end
    复制代码


    NSString+Number.m
    1. //
    2. //  NSString+Number.m
    3. //  Category-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "NSString+Number.h"
    9. // 分类实现部分同样与主类的实现部分类似,唯一不同的是后面加"(分类名)";
    10. @implementation NSString (Number)
    11. // 一个计算字符串中数字个数的类方法,由于系统定义的NSString中没有该方法,所以我们通过这种方式扩充功能
    12. + (short)numberCountOfString:(NSString *)str
    13. {
    14.     // 定义一个临时变量做为返回值,并赋初值,否则值随机;
    15.     short count = 0;
    16.    
    17.     // 通过for循环来遍历字符串中的每一个字符
    18.     for (int i = 0; i < str.length; i++) {
    19.    
    20.         // NSString提供了取字符串字符的系统方法"- (unichar)characterAtIndex:(NSUInteger)index;"直接调用返回字符
    21.         unichar c = [str characterAtIndex:i];
    22.         
    23.         // 对返回的字符进行判断,该字符是否为数字
    24.         if ( c >= '0' && c <= '9') {
    25.         
    26.             // 如果为数字计算器加1
    27.             count++;
    28.         
    29.         }
    30.     }
    31.    
    32.     // 返回最终计算器的值即为数字个数,为节约空间,函数返回值类型为short int,即2个字节;即最大表示可到2^15-1,应该够用了
    33.     return count;
    34. }
    35. @end
    复制代码


    main.m
    1. //
    2. //  main.m
    3. //  Category-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. // 注意要包含分类的头文件,否则分类未声明,无法使用
    10. #import "NSString+Number.h"
    11. int main()
    12. {
    13.    
    14.     // 创建一个字符串对象,并赋值
    15.     NSString * str = @"yusian.com-2013-12-20";
    16.    
    17.     // 定义一个short类型数据来保存分类方法返回的结果值
    18.     short num = [NSString numberCountOfString:str];
    19.    
    20.     // 打印输出
    21.     NSLog(@"The number count of %@ is %d", str, num);
    22.     return 0;
    23. }
    复制代码


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



  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

     楼主| 发表于 2014-3-18 09:35:10 | 显示全部楼层
    本帖最后由 Sian 于 2014-3-18 09:46 编辑

    以上是通过类方法实现,其实还可以通过对象方法一样的可以实现,参考代码如下:
    1. - (short)numberCount
    2. {
    3.     int count = 0;
    4.    
    5.     for (int i = 0; i < self.length; i++) {
    6.    
    7.         unichar c = [self characterAtIndex:i];
    8.         
    9.         if ( c >= '0' && c <= '9') {
    10.         
    11.             count++;
    12.             
    13.         }
    14.    
    15.     }
    16.    
    17.     return count;
    18.     // 或者通过调用类方法实现
    19.     // return [NSString numberCountOfString:self];
    20. }
    复制代码

    同样的道理,类方法也可以通过调用对象方法来实现,只需一句代码:
    return [str numberCount];
    两者可以相互转换,但不能同时调用对方,会进入死循环!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-11-25 12:04 , Processed in 0.049801 second(s), 24 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表