类目:非正式协议(类目名)对一个类(原有类-什么都没有)方法的扩展(注:只允许添加方法不允许添加变量)
1、命名规则:类名+类目的名称(要扩展的哪一个方向)
2、什么时候使用类目
①、团队开发同一个任务(同一个类),又想不互相影响->就可以使用类目
②、扩展系统类里面的方法->OC是不开源的不能修改原有类的.m文件增加方法实现->使用类目
3、调用的时候使用原有类去调用(类方法-原有类的类名调用)(对象方法-原有类的对象调用)
4、创建一个类目-> command+N ->object-c file -> category ->第一个输入内容:类目的名字第二个输入的内容:要扩展的类
// 判断是否是 emoji表情
- (BOOL)isEmoji {
BOOL returnValue = NO;
const unichar hs = [self characterAtIndex:0];
// surrogate pair
if (0xd800 <= hs && hs <= 0xdbff) {
if (self.length > 1) {
const unichar ls = [self characterAtIndex:1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
returnValue = YES;
}
}
} else if (self.length > 1) {
const unichar ls = [self characterAtIndex:1];
if (ls == 0x20e3) {
returnValue = YES;
}
} else {
// non surrogate
if (0x2100 <= hs && hs <= 0x27ff) {
returnValue = YES;
} else if (0x2B05 <= hs && hs <= 0x2b07) {
returnValue = YES;
} else if (0x2934 <= hs && hs <= 0x2935) {
returnValue = YES;
} else if (0x3297 <= hs && hs <= 0x3299) {
returnValue = YES;
} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
returnValue = YES;
}
}
return returnValue;
}
/**
* 得到文字和字体就能计算文字尺寸
*
* @param text 需要计算尺寸的文字
* @param font 文字的字体
* @param maxW 最大的宽度
*
* @return
*/
- (CGSize)sizeWithFont:(UIFont *)font maxW:(CGFloat)maxW {
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSFontAttributeName] = font;
CGSize maxSize = CGSizeMake(maxW, MAXFLOAT);
NSLog(@"IOS7以上的系统");
return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}
- (CGSize)sizeWithFont:(UIFont *)font {
return [self sizeWithFont:font maxW:MAXFLOAT];
}
//适合的高度 默认 systemFontOfSize:font
- (CGFloat)heightWithFont:(NSInteger)font w:(CGFloat)w {
return [self boundingRectWithSize:CGSizeMake(w, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:font] } context:nil].size.height;
}
//适合的宽度 默认 systemFontOfSize:font
- (CGFloat)widthWithFont:(NSInteger)font h:(CGFloat)h {
return [self boundingRectWithSize:CGSizeMake(MAXFLOAT, h) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:font] } context:nil].size.width;
}
//去空格
- (NSString *)delSpace {
return [self stringByReplacingOccurrencesOfString:@" " withString:@""];
}
//去空格
- (NSString *)delBlank {
return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
//转为 base64string后的Data
- (NSData *)base64Data {
return [[NSData alloc] initWithBase64EncodedString:self options:0];
}
// 转为 base64String
- (NSString *)base64Str {
return [[self dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}
//解 base64为Str 解不了就返回原始的数值
- (NSString *)decodeBase64 {
NSString *WillDecode = [[NSString alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:self options:0] encoding:NSUTF8StringEncoding];
return (WillDecode.length != 0) ? WillDecode : self;
}
//按字符串的,逗号分割为数组
- (NSArray *)combinArr {
if ([self hasSuffix:@","]) {
return [[self substringToIndex:self.length - 1] componentsSeparatedByString:@","];
}
return [self componentsSeparatedByString:@","];
}
//是否包含对应字符
- (BOOL)containStr:(NSString *)subString {
return ([self rangeOfString:subString].location == NSNotFound) ? NO : YES;
}
//拼上字符串
- (NSString *)addStr:(NSString *)string {
if (!string || string.length == 0) {
return self;
}
return [self stringByAppendingString:string];
}
- (NSString *)addInt:(int)string {
return [self stringByAppendingString:@(string).stringValue];
}
//32位MD5加密
- (NSString *)MD5 {
const char *cStr = [self UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, (CC_LONG) strlen(cStr), digest);
NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[result appendFormat:@"%02x", digest[i]];
}
return [result copy];
}
//SHA1加密
- (NSString *)SHA1 {
const char *cStr = [self UTF8String];
NSData *data = [NSData dataWithBytes:cStr length:self.length];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (CC_LONG) data.length, digest);
NSMutableString *result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[result appendFormat:@"%02x", digest[i]];
}
return [result copy];
}
/** 中文转拼音 */
- (NSString *)pinYinWithString:(NSString *)chinese
{
NSString * pinYinStr = [NSString string];
if (chinese.length){
NSMutableString * pinYin = [[NSMutableString alloc]initWithString:chinese];
//1.先转换为带声调的拼音
if(CFStringTransform((__bridge CFMutableStringRef)pinYin, 0, kCFStringTransformMandarinLatin, NO)) {
NSLog(@"pinyin: %@", pinYin);
}
//2.再转换为不带声调的拼音
if (CFStringTransform((__bridge CFMutableStringRef)pinYin, 0, kCFStringTransformStripDiacritics, NO)) {
NSLog(@"pinyin: %@", pinYin);
//3.去除掉首尾的空白字符和换行字符
pinYinStr = [pinYinStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//4.去除掉其它位置的空白字符和换行字符
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\r" withString:@""];
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@" " withString:@""];
}
}
return pinYinStr;
}
-(NSString*)encodeString{
// CharactersToBeEscaped = @":/?&=;+!@#$()~',*";
// CharactersToLeaveUnescaped = @"[].";
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
//URLDEcode
-(NSString *)decodeString
{
//NSString *decodedString = [encodedString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding ];
NSString *decodedString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,
(__bridge CFStringRef)self,
CFSTR(""),
CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
return decodedString;
}
//计算字符串长度 1中文2字符
- (int)textLength {
float number = 0.0;
for (int index = 0; index < [self length]; index++) {
NSString *character = [self substringWithRange:NSMakeRange(index, 1)];
if ([character lengthOfBytesUsingEncoding:NSUTF8StringEncoding] == 3) {
number = number + 2;
} else {
number = number + 1;
}
}
return ceil(number);
}
//限制最大显示长度
- (NSString *)limitMaxTextShow:(NSInteger)limit {
NSString *Orgin = [self copy];
for (NSInteger i = Orgin.length; i > 0; i--) {
NSString *Get = [Orgin substringToIndex:i];
if (Get.textLength <= limit) {
return Get;
}
}
return self;
}
//邮箱格式验证
- (BOOL)validateEmail {
NSString *emailRegex = @"\\b([a-zA-Z0-9%_.+\\-]+)@([a-zA-Z0-9.\\-]+?\\.[a-zA-Z]{2,6})\\b";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:self];
}
//验证是否ASCII码
- (BOOL)isASCII {
NSCharacterSet *cs;
cs = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@/:;()¥「」!,.?<>£"、[]{}#%-*+=_\\|~<>$€^•'@#$%^&*()_+'\"/"
""];
NSRange specialrang = [self rangeOfCharacterFromSet:cs];
if (specialrang.location != NSNotFound) {
return YES;
}
return NO;
}
//验证是含本方法定义的 “特殊字符”
- (BOOL)isSpecialCharacter {
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」!,.?<>£"、[]{}#%-*+=_\\|~<>$€^•'@#$%^&*()_+'\"/"
""];
NSRange specialrang = [self rangeOfCharacterFromSet:set];
if (specialrang.location != NSNotFound) {
return YES;
}
return NO;
}
// 验证是否是数字
- (BOOL)isNumber {
NSCharacterSet *cs;
cs = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
NSRange specialrang = [self rangeOfCharacterFromSet:cs];
if (specialrang.location != NSNotFound) {
return YES;
}
return NO;
}
// 验证字符串里面是否都是数字
- (BOOL)isPureNumber {
NSUInteger length = [self length];
for (float i = 0; i < length; i++) {
// NSString * c=[mytimestr characterAtIndex:i];
NSString *STR = [self substringWithRange:NSMakeRange(i, 1)];
NSLog(@"%@", STR);
if ([STR isNumber]) {
continue;
} else {
return NO;
}
}
return YES;
}
//去掉 表情符号
- (NSString *)disableEmoji {
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]" options:NSRegularExpressionCaseInsensitive error:nil];
NSString *modifiedString = [regex stringByReplacingMatchesInString:self
options:0
range:NSMakeRange(0, [self length])
withTemplate:@""];
return modifiedString;
}
平时多总结,总会有用到的时候。


