本讲主要内容
- 掌握 NSDate 的使用
- 掌握 NSDateFormatter 的使用
- 掌握 Category 的定义和使用
- 掌握 Extension的定义和使用
- 掌握 Protocol 的定义和使用
- 掌握 delegate 的使用
1.NSDate
NSDate是处理日期和时间的基础类,封装了某一给定的时刻.
使用+ date 方法获取当前时间,但无论你是哪个市区,获取的时间都是0时区的时间
NSDate *nowDate = [NSDate date];NSLog(@"%@", nowDate);打印的时间是.0时区的时间.
1. 创建一个现在的时间NSDate *nowDate = [NSDate date];2. 创建一个明天现在的时间.NSDate *tomorrow = [NSDate dateWithTimeintervalSinceNow:24*3600];
3. 创建一个昨天现在的时间NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-1*24*3600];
4. 计算两个时间之间的间隔NSTimeInterval (即double 类型) 用以表示以秒为单位 的时间间隔
NSTimeInterval *time = [tomorrow timeIntervalSinceDate:yesterday];NSLog(@"%.0f", time/3600) NSTimeInterval 以秒为单位故除以3600 计算出小时
小练习计算当前时间和⼀一个固定时间的差值,如果差值在60秒内,输出“刚刚”,如果在60秒外3600秒内,输出“xx分钟前”,如果3600秒外, 3600*24秒内,输出“xx⼩小时前”
NSDate *nowDate = [NSDate dateWithIntervalSinceNow:这里任意输入一个时间以秒为单位];
NSTimeInterval *time = [nowDate timeIntervalSinceNow]
if(time <= 60)
{
NSLog(@"刚刚发布");
} else if (time >60 && time <= 3600)
{
NSLog(@"%.2f分钟前发布", time/60);
} else if (time > 3600 && time <= 3600 *24)
{
NSLog(@"%.2f 小时前发布", time/3600);
} else
{
NSL(@"%@", nowDate);
}
2. NSDateFormatterNSDateFormatter 是IOS 中给日期格式化的类.功能是实现. NSString 和 NSDate 的互转
常见的时间格式化字符串有以下一些:y 年, M(要大写) 月, d 日 H 一天中的小时数(大写 H 表示24小时指 h am/pm 表示12小时制) m 分钟. s 秒第一步. 创建一个时间格式化类NSDateFormatter *dateFormatter = [NSDateFormatter alloc] init];
第二步. 设置格式化时间的样式(格式)[dateFormatter setDateFormat:@"yyyy年MM月dd日HH时mm分ss秒"];
第三步. 把现在的时间转成字符串 (格式化时间会自动设置为当前电脑的时区)NSString *timeStr = [dateFormatter stringFromDate:[NSDate date]];
把字符串转成时间NSDate *strTime = [dateFormatter dateFromString:@"2014年11月12日 12时11分11秒"];注意:要转的字符串 必须是 setDateFormat 里 设置的 格式(@"yyyy年MM月dd日HH时mm分ss秒"")相同 ,否则无法输出正确结果.
3. Category
Category 也叫做分类和类目,其主要作用是为 没有源代码(没有.M 文件或者看不到.M 文件的) 的类添加方法
通过 Category 添加的方法会成为成为 "原类"的一部分从而达到扩展一个类的功能.
那么如何去定义一个 Category呢?
1. 首先 Xcode cmmand + n 新建一个文件. 选择 Objective - C Category 模板2. 填写分类名字 和 选择要给 那个类扩展3. 在生成的. h 文件中添加方法的声明4. 在. m 文件总添加方法的实现
Category 的声明以 NSString 为例:NSString + SayHi.文件
@interface NSString (SayHi)
- (void)hi;
@end
Category 的实现NSString +SayHi.m 文件里
#import "NSString + SayHi.h"
@implementation NSString (SayHi)
- (void)SayHi{NSLog(@"这是通过 Category 为 NSString 添加的方法实现");}@end
Category 与 子类的区别
Category :只能为类添加方法 新添加的方法会成为 原始类的一部分.能被子类继承使用原始类的实例(- 号方法),或者 原始类 (+号方法)来调用
Subclass: 既能为类添加方法也能添加变量. 新添加的方法只有子类有.父类不具有
且子类才能调用.
4. Extension
EXtension 的主要作用是管理类的"私有"方法. 帮助我们去管理这些内部使用的方法(不公开的)
如何定义 EXtensionExtension 的语法格式和 Category 很相似
就是相当于把用 Category 创建的.h 文件里 的声明 写到 .m 文件中
Extension 针对的是自己的类.必须有源代码的类(有. m 文件)
xxx.m 文件
@interface xxx (ExtensionName)
// 你的方法列表@end
@implementation xxx
// 你的方法实现
@end
Category 和 Extension 的区别
Category:为没有源代码(没有. m 文件)的类添加方法 定义 一对. h 和.mExtension: 管理类的私有方法.只有一个. m 把 要写在. h 里的声明直接写到. m 中
Protocol 协议是 iOS 开发中常用的技术.协议是一套标准(一些方法的声明),它只有. h 文件.没有.m 实现文件..就像是一张任务清单,上面写了一对需要处理的事情(一些方法的声明), 清单交给谁.谁就要去完成清单上规定的任务.
接受协议的对象.实现协议中定义的方法.
通俗来说:谁接受了协议就要去 谁就要实现协议中定义的方法,如果不完成不了.就让他滚蛋.
那么如何定义一个 Protocol 呢.
Xcode commnd + n 新建文件. 选择 Objective - C protocol
#import <Foundation/Foundation.h> @protocol MarryProtocol <NSObject>
// 在协议中声明一些方法. // @required 修饰协议中的方法是必须实现的 @required #pragma mark - 声明方法 #pragma mark 赚钱 - (void)makeMoney; #pragma mark 工作 - (void)working; // @optional 修饰协议中的方法是可选实现的 不写的话,默认是必须实现的 可选方法实不实现随便你 @optional #pragma mark 做饭 - (void)cook; #pragma mark 洗衣服 - (void)washCloth; @end
遵守协议
1. 在类的. h 文件 父类名后协商<协议名>.
2. 在. m 文件中去实现一些中的方法
相当于给这个类添加了若干个方法.这个类的实例就可以调用这些方法
那么如何遵守协议
#import <Foundation/Foundation.h> #import "MarryProtocol.h" // 遵守协议的语法是: 在声明文件中,父类名的后面使用"<>",将协议名放到尖括号中 @interface Boy : NSObject <MarryProtocol> { NSString *_name; } - (instancetype)initWithName:(NSString *)name; + (instancetype)boyWithName:(NSString *)name; - (void)setName:(NSString *)name; - (NSString *)getName; @end
delegate 设计模式
Protocol 的核心使用场景是实现 delegate 设计模式
delegate (代理).通俗来讲就是代理商.主要的任务是帮你完全一些任务
比如:保姆可以认为是 delegate. 主要任务是帮你带孩子 做饭.洗衣服
使用场景就是.某些任务自己不去实现.让别人去实现的时候.就可以指定一个代理..让代理去帮你做(实现协议里的方法);
总结:
NSDate 是 iOS 中表示日期的类.可以使用 NSDateFormatter 来控制 NSString 和 NSDate 的互转
Category 能为没有源代码(没有. m 文件)的类添加方法
Extension 为类管理私有方法 (把. h 的声明 直接写到. m 里)
Protocol 和 delegate 通常联合使用,是 iOS 开发中特别常用的.