ios分类(Categories)和类扩展(Extensions)的区别

来源:互联网 发布:linux find type f 编辑:程序博客网 时间:2024/05/01 19:50

最近在写一个项目,需要写一个公共的方法将十六进制的颜色转换为UIColor,但系统的UIKit框架里面没有这种直接转化的方法,我们又无法在系统的UIColor里面添加这个公共的方法,于是想到了category,顺便总结了下extension。

1.首先介绍一下分类:

新建一个objective-c File

@interface UIColor(Hex)

+ (UIColor *)colorWithHexString: (NSString *)hexString;

@end

.m实现代码如下

#import "UIColor+Hex.h"

@implementation UIColor(Hex)

#pragma mark - 颜色转换 iOS中十六进制的颜色转换为UIColor

+ (UIColor *)colorWithHexString:(NSString *)hexString
{
    NSString *cString = [[hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
    
    // hexString应该6到8个字符
    if ([cString length] < 6) {
        return [UIColor clearColor];
    }
    
    // 如果hexString 有@"0X"前缀
    if ([cString hasPrefix:@"0X"])
        cString = [cString substringFromIndex:2];
    
    // 如果hexString 有@"#""前缀
    if ([cString hasPrefix:@"#"])
        cString = [cString substringFromIndex:1];
    if ([cString length] != 6)
        return [UIColor clearColor];
    
    //RGB转换
    NSRange range;
    range.location = 0;
    range.length = 2;
    
    //R
    NSString *rString = [cString substringWithRange:range];
    
    //G
    range.location = 2;
    NSString *gString = [cString substringWithRange:range];
    
    //B
    range.location = 4;
    NSString *bString = [cString substringWithRange:range];
    
    //
    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];
    
    return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:1.0f];
}
@end

这样就可以实现将十六进制的颜色转换为UIColor

2.类扩展能为某个类附加额外的属性,一般的类扩展写在.m文件中,通过这种方式写的属性属于类的私有属性,不能被外界访问。格式如下:

@interface  类名()
//属性
@end

注意二者显著区别在于分类的写法类名的后面()中要有分类名字,而类扩展没有。


阅读全文
0 0
原创粉丝点击