类的扩展
OC数据类型
1.NSInteger, NSUInteger
2.CGFloat
3.NSString, NSMutableString
4.NSArray, NSMutableString
5.NSNumber
6.NSDictionary, NSMutableDictionary
7.NSSet, NSMutableSet
NSDate, 日期类, 继承于NSObject, 用于存储一个时间点
获取当前时间(0时区时间, 格林尼治时间)
NSDate *date = [NSDate date]; NSLog(@"%@", date);
//NSTimeInterval = double NSDate *date1 = [NSDate dateWithTimeIntervalSinceNow:60]; NSLog(@"%@", date1); //昨天的现在时刻 NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:(-1 * (24 * 60 * 60))]; NSLog(@"%@", yesterday); //明年的现在时刻 NSDate *nextYear = [NSDate dateWithTimeIntervalSinceNow:366 * 24 * 60 * 60]; NSLog(@"%@", nextYear); //昨天的现在时刻 与 明年的现在时刻 间隔多少秒 NSTimeInterval interval = [yesterday timeIntervalSinceDate:nextYear]; NSLog(@"%lf", interval);
时间戳: 某一时刻与 1970.1.1 间隔的秒数
//创建一个时间戳 //把日期转化成时间戳 NSTimeInterval timestamp = [date timeIntervalSince1970]; NSLog(@"%lf", timestamp); //把时间戳转化成日期 NSTimeInterval timestamp1 = 200; NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:timestamp1]; NSLog(@"%@", date2);
打印日期的格式: 年-月-日时:分:秒时区
NSDateFormatter, 日期格式类, 继承于NSFormatter
NSDate <-----NSDateFormatter------> NSString
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
设置日期格式(2015年10月8日)
YYYY/yyyy: 四位年份
YY/yy: 两位年份
MM: 两位月份, 不足两位补0
M: 一位月份
dd: 两位天期, 不足两位补0
d: 一位天数
DD/D: 这一天是这一年的第几天
HH: 24小时制
hh: 12小时制
mm: 分钟
ss: 秒
z: 时区
[formatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss z"];
设置时区
NSTimeZone, 时区类, 继承于NSObject
GMT: 格林尼治时间
PST: 太平洋标准时间
EST: 美国东部时间
NSTimeZone *timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; [formatter setTimeZone:timeZone];
NSDate转化为NSString
NSString *dateString = [formatter stringFromDate:date]; NSLog(@"%@", dateString);
将字符串@“2014年05月01日 10点23分18秒”转换为NSDate对象
NSString *string = @"2014年05月01日 10点23分18秒"; [formatter setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"]; [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; NSDate *stringDate = [formatter dateFromString:string]; NSLog(@"%@", stringDate);
类的扩展(添加实例变量或方法)
1.对已知类的扩展
注: 已知类, 能够看到源代码(.m文件)
A.直接修改(能够添加实例变量和方法)
B.Extension, 延展(可以添加实例变量和方法的声明)
注: 延展用于对已知类, 扩充类内部使用的实例变量和方法
对声明的延续
1.Person_Cosplay.h#import "Person.h" @interface Person () - (void)dance; @end
2.Person.m@interface Person () { NSInteger _age; } - (void)dance; @end @implementation Person - (void)setName:(NSString *)name { _name = name; } - (NSString *)name { return _name; } - (void)eat { NSLog(@"吃个便饭"); [self dance]; } - (void)dance { NSLog(@"动次打次"); } @end
main.m
[person eat];
方法
1.公开方法(方法声明写在.h中), 在类的内部和外部使用
2.私有方法(方法声明写在.m的延展中), 在类的内部使用
2.对未知类的扩展
注: 未知类, 不能看到源代码(.m文件)
A.继承(添加实例变量和方法)
缺点: 扩展方法和实例变量, 只有子类才具备, 父类不能够使用
B.Category, 范畴, 类目, 分类(只能添加方法, 内部不能添加实例变量)
NSString+play.h#import <Foundation/Foundation.h> @interface NSString (play) /* { CGFloat _price; } */ - (void)playBasketball; @end
NSString+play.m #import "NSString+play.h" @implementation NSString (play) - (void)playBasketball { NSLog(@"怒扣敬明"); } @end
main.m NSString *string2 = [[NSString alloc] init]; [string2 playBasketball];
Protocol, 协议(只定义了方法的声明)
只有遵守了协议. 协议才生效, 遵守协议的类必须完成方法的实现
协议具有普遍使用性, 不是针对某一个类
Love.h//协议 #import <Foundation/Foundation.h> @protocol Love <NSObject> @required//必须遵守的(默认值) - (void)buyFood; - (void)sendWater; @optional//可选的 - (void)buyiPhone; @end
Student.h #import <Foundation/Foundation.h> //一个类如何遵守协议 //1.引入协议 #import "Love.h" //2.遵守协议 @interface Student : NSObject <Love> @end
Student.m #import "Student.h" @implementation Student - (void)buyFood { NSLog(@"早起, 排队, 买热包子, 小跑送到楼下"); } - (void)sendWater { NSLog(@"大热天, 排队接水, 送到楼下"); } - (void)buyiPhone { NSLog(@"省吃俭用, 中午不吃饭, 晚上辣椒蘸酱油, 坚持了一年, 终于攒够了公交费到那里, 卖了个肾, 买了个iPhone送给TA, Ta说分手吧"); } @end
main.m Student *stu = [[Student alloc] init]; [stu buyFood]; [stu sendWater]; [stu buyiPhone];
代理模式(委托模式, Delegate), 是一种设计模式
Woman.h #import <Foundation/Foundation.h> #import "Nurse.h" @interface Woman : NSObject { //delegate实例变量 //1.因为不确定最终找到的保姆是什么类型, 类型用id //2.并不是所有人都可以当保姆, 必须遵守协议 //注: id<Nurse>, 基于类型的限定 id<Nurse> _delegate; } - (void)setDelegate:(id<Nurse>)delegate; - (id<Nurse>)delegate; - (void)work; - (void)cook; - (void)takeCareOfBaby; @end
Woman.m #import "Woman.h" @implementation Woman - (void)setDelegate:(id<Nurse>)delegate { _delegate = delegate; } - (id<Nurse>)delegate { return _delegate; } - (void)work { NSLog(@"辛苦工作"); } - (void)cook { // NSLog(@"精心做饭"); //判断代理有没有做饭的能力(判断delegate是否相应canCook这个方法) if ([_delegate respondsToSelector:@selector(canCook)]) { [_delegate canCook]; } } - (void)takeCareOfBaby { // NSLog(@"耐心照看孩子"); if ([_delegate respondsToSelector:@selector(canTakeCareOfBaby)]) { [_delegate canTakeCareOfBaby]; } } @end
Nurse.h//协议 #import <Foundation/Foundation.h> @protocol Nurse <NSObject> - (void)canCook; - (void)canTakeCareOfBaby; @end
Chef.h #import <Foundation/Foundation.h> #import "Nurse.h" @interface Chef : NSObject<Nurse> @end
Chef.m #import "Chef.h" @implementation Chef - (void)canCook { NSLog(@"做了蚂蚁上树, 锅包肉, 小鸡炖蘑菇, 铁锅炖大鹅"); } - (void)canTakeCareOfBaby { NSLog(@"厨师教孩子刀法"); } @end
main.m Woman *woman = [[Woman alloc] init]; [woman work]; [woman cook]; [woman takeCareOfBaby]; Chef *chef = [[Chef alloc] init]; //妇女设定代理是厨师 [woman setDelegate:chef]; //妇女想要做饭 [woman cook]; [woman takeCareOfBaby];
从妇女角度出发, 找保姆
1.制定一个保姆的标准(协议)
2.找到保姆后, 和保姆建立关系(写一个delegate实例变量, 写上对应的setter和getter)
3.让代理去做某件事(安全做法: 判断代理能否执行某个方法)
从保姆的角度出发, 找工作
1.满足雇主的要求(遵守协议)
2.与雇主建立关系