天天看點

OC特有文法:分類category,給NSString增加方法計算字元串中數字的個數

1:分類的使用場景:想對一個類,擴充一些功能,而又不改變原來類的模型,也不用繼承,這時OC中的特有文法:分類可以做到;

當然分類也是一個類,也需要聲明和實作,聲明在.h檔案中,實作在.m檔案中,格式如下

// 聲明

@interface  類名  (分類名稱)

@end

// 實作

@implementation 類名 (分類名稱)

2:分類的好處,當一個類比較龐大時,不同的部分可以放到不同的分類中,也友善團隊中類的開發;

3:分類使用注意:

  a:分類不能增加成員變量,隻能對原類增加方法;

  b:分類方法實作中,可以通路原來類的成員變量;

  c:分類可以寫和類同名的方法,但是這樣會覆寫掉原來類的方法,導緻永遠通路不到原來的類的方法,是以不建議這麼做;

    調用順序:分類——找不到方法時去——>原來類——找不到方法時去——>父類;可見分類的調用優先級最高;

  d:當一個類有單個分類時,且每個分類都由同名方法,調用順序和編譯的順序有關,最後編譯的方法會覆寫先編譯的方法,是以最後編譯的會被調用;

分類的應用:給NSString增加方法,計算一個字元串中數字的個數;

// 在NSString+intSum.h檔案中
//  對NSString類添加一個類方法和對象方法,計算字元串中整數的個數;

#import <Foundation/Foundation.h>

@interface NSString (intSum)


//對NSString類添加一個類方法,計算字元串中整數的個數,聲明
+ (int)intSum:(NSString *)str;

// 對象方法的聲明
- (int)intCount;

@end


// 在NSString+intSum.m檔案中

@implementation NSString (intSum)

// 類方法的實作
+ (int)intSum:(NSString *)str
{
    int count = 0;
    for (int i = 0; i<str.length; i++) {
        int temp = [str characterAtIndex:i];
        if (temp > '0' && temp < '9') {
            count++;
        }
    }
    return count;
}


// 對象方法的實作,隻需調用類方法就可以了;
- (int)intCount
{
    return [NSString intSum:self];
}

@end


// 在main中測試

int main()
{
    
    int sum = [NSString intSum:@"234df56"]; // 調用類方法
    
    int count = [@"234sd454545" intCount]; // 調用對象方法


    NSLog(@"sum=%d, count=%d", sum, count);
    return 0;
}