Objective - c 7.类的扩展

本讲主要内容
  • 掌握 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. NSDateFormatter 
NSDateFormatter 是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 的主要作用是管理类的"私有"方法. 帮助我们去管理这些内部使用的方法(不公开的)

如何定义 EXtension
Extension 的语法格式和 Category 很相似

就是相当于把用 Category 创建的.h 文件里 的声明 写到 .m 文件中

Extension 针对的是自己的类.必须有源代码的类(有. m 文件)

xxx.m 文件

@interface xxx (ExtensionName)

// 你的方法列表
@end

@implementation xxx

// 你的方法实现

@end

 Category 和 Extension 的区别

Category:为没有源代码(没有. m 文件)的类添加方法  定义 一对. h 和.m
Extension: 管理类的私有方法.只有一个. 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 开发中特别常用的.



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值