OC语言类的扩展
2015-07-27 09:06
453 查看
// setValue和setObject的区别 NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"1",@"2",@"3",@"4",@"5",@"6", nil]; // 当用setValue时,如果前边value里放的是一个空值nil,那么这个方法会被removeForKey代替 即删除一对键值对 [dic setValue:nil forKey:@"2"]; NSLog(@"%@", dic); // 而setObject并不能实现此功能 如果遇到这种情况(值为nil) 会崩溃 [dic setObject:nil forKey:@"2"]; NSLog(@"%@", dic);
类目 category
// 系统已经写好的类目:按照功能对系统的类方法进行区分 // 类目从@interface开始,后面是当前类的名字,类名后是分类的功能,到@end结束 // 我们创建的类目,一般是为了把一些系统的类进行功能扩充 // 自己加入的NSString方法 // 这里str赋空值时不会执行此方法 @""可以 里边有元素\0 NSDate *date1 = [NSDate dateWithString:@"2014-08-14 18:00:00"]; NSTimeInterval time = 3600; date1 = [NSDate dateWithTimeInterval:time sinceDate:date1]; NSLog(@"%@", date1); NSString *str1 = @"2014-08-14 18:00:00"; NSString *str2 = @"2014-08-14 20:00:00"; NSString *strTest = [str1 substringFromIndex:12]; NSLog(@"%@", strTest); // 判断两个时间是否相同 BOOL isTrue = [str1 judgeTwoDate:str2]; NSLog(@"%d", isTrue); // 将两个时间拼接成一个时间段 NSString *str0 = [str1 appendTwoDate:str2]; NSLog(@"%@", str0); // 判断一个时间是否在这个时间段内 NSString *str = @"2014-08-14 18:46:30"; BOOL T = [str judgeInTimeZone:str1 end:str2]; NSLog(@"%d", T); // 将字符串形式转化为NSDate形式输出 // 这里str一定要是@"yyyy-MM-dd hh:mm:ss"形式 // hh表示12小时制,HH表示24时制 NSDate *date = [str stringToDate]; NSLog(@"%@", date); NSDate *date0 = [NSString stringToDate:str]; NSLog(@"%@", date0);
/* * NSString+StringMethod.h */ @interface NSString (StringMethod) - (void)sayHi; // 输入两个日期,判断两个日期是否在同一个月 // 这个方法需要两个参数,第一个参数就是方法的调用者,谁调用了这个方法,那么在这个方法内部,self就是使用方法的那个对象 - (BOOL)judgeTwoDate:(NSString *)anotherDate; - (NSString *)appendTwoDate:(NSString *)anotherDate; // 给定两个时间,判断时间是否在这两个时间区间内 - (BOOL)judgeInTimeZone:(NSString *)beginTime end:(NSString *)endTime; // 传过去一个字符串,返回一个时间的对象NSDate类型 - (NSDate *)stringToDate; + (NSDate *)stringToDate:(NSString *)dateStr; @end
/* * NSString+StringMethod.m */ @implementation NSString (StringMethod) - (void)sayHi { NSLog(@"你好"); } - (BOOL)judgeTwoDate:(NSString *)anotherDate { return [[self substringWithRange:NSMakeRange(5, 2)] isEqualToString:[anotherDate substringWithRange:NSMakeRange(5, 2)]]; } - (NSString *)appendTwoDate:(NSString *)anotherDate { if ([[self substringToIndex:11] isEqualToString:[anotherDate substringToIndex:11]]) { NSString *endDate = [anotherDate substringFromIndex:11]; NSLog(@"%@", endDate); return [NSString stringWithFormat:@"%@ - %@", self, endDate]; } else { return NO; } } // 这种方法称为私有方法,不让类外部去使用,只能类内部去使用 - (void)shangshuai { NSLog(@"我是商帅"); } - (BOOL)judgeInTimeZone:(NSString *)beginTime end:(NSString *)endTime { NSString *timeZone = [beginTime appendTwoDate:endTime]; if ([[self substringToIndex:11] isEqualToString:[timeZone substringToIndex:11]]) { NSInteger timeA = [[self substringWithRange:NSMakeRange(11, 2)] intValue]; NSInteger timeB = [[beginTime substringWithRange:NSMakeRange(11, 2)] intValue]; NSInteger timeC = [[endTime substringWithRange:NSMakeRange(11, 2)] intValue]; if (timeA <= timeC && timeA >= timeB) { return YES; } else { return NO; } } else { return NO; } } - (NSDate *)stringToDate { // 设置格式 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; return [formatter dateFromString:self]; } + (NSDate *)stringToDate:(NSString *)dateStr { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; return [formatter dateFromString:dateStr]; } @end
/* * Student.h */ @interface Student : NSObject @property(nonatomic, copy)NSString *stuSex; @end
延展Extension
/* * Student.m */ // 延展以@interface开头,然后写当前的类名,最后加一个(),到@end结束 // 一般延展会写在自己写的.m文件中,把一些不想让别人外部调用的属性放在延展里,这样这条属性只能在类的内部使用,外部使用不了,尽最大的可能保护当前类的安全 // 类目一般都是给看不见.m的系统文件进行扩展,延展一般都是针对自己的类进行操作 @interface Student () @property(nonatomic, copy)NSString *name; @end @implementation Student - (void)create { _name = @"王二麻子"; NSLog(@"%@", _name); } @end
协议Protocol
/* * girl.h */ // 1.声明一份协议 // @protocol 协议的关键词 在@interface的上面书写 @protocol Marry <NSObject> // 协议的内容 // 协议方法的声明 // @required是必须实现的方法,为系统默认 - (void)makeMoney; // optional可选择执行的方法 @optional - (void)cook; @end @interface Girl : NSObject // 2.设置代理人(delegate)的属性 @property(nonatomic, assign)id<Marry>delegate; // 两个人结婚之后,协议才正式生效 - (void)getMarry; @end
/* * girl.m */ @implementation Girl - (void)getMarry { // 3.让代理人去执行协议里的方法 [self.delegate makeMoney]; } @end
#import "Girl.h" // 4.引完头文件之后,boy需要签订协议 @interface Boy : NSObject<Marry> - (void)makeMoney; @end
// 创建两个对象 Boy *yadang = [[Boy alloc] init]; Girl *xiawa = [[Girl alloc] init]; // 5.设置代理人 xiawa.delegate = yadang; // 通过调用结婚的方法,来执行内部的协议方法 [xiawa getMarry]; // 与[yadang makeMoney]执行操作相同 // 如果想更改执行的代理人 只需重新定义一个类 执行4,5,6步即可
@implementation Boy // 6.实现协议方法makeMoney - (void)makeMoney { NSLog(@"买买买"); } @end
相关文章推荐
- C++ new 的用法
- C语言中指针和自增运算符结合时的运算顺序问题
- 三种初步简易的方法求解数值问题 of C++
- 《C++编程思想》第二章 数 据 抽 象(原书代码+习题+答案)
- 读书笔记MoreEffectiveC++(12)
- c++ 字符反转函数
- 黑马程序员------C语言程序 const、static和extren 及内存管理
- 病毒侵袭
- 读书笔记MoreEffectiveC++(11)
- c++ 覆盖、重载与隐藏规则
- C++ Primer快速入门之六:数组和指针
- C++数据类型的熟悉
- C语言程序 数组
- C/C++时间获取及格式化输出汇总
- C语言中EOF与Ctrl+Z
- C++调用c# dll
- C++课程设计——停车场管理系统
- C++中的虚函数表是什么时期建立的?
- c/c++基础
- C++ transform