您的位置:首页 > 编程语言 > Go语言

day7: 类的扩展 NSDate NSDateFormatter Category Extension延展 Protocol协议 delegate代理

2015-08-21 18:23 483 查看
1 掌握NSDate的使⽤

2 掌握NSDateFormatter的使用

3 掌握Category的定义和使用

4 掌握Extension的定义和使用

5 掌握Protocol的定义和使用

6 掌握delegate的使用

内存五个区域对应的单词:

栈区 stack

堆区 heap

静态区 static global

常量区 constant

代码区 code

yy: 年的后2位

yyyy: 完整年

MM: 月,显示为1-12

MMM: 月,显示为英文月份简写,如 Jan

MMMM: 月,显示为英文月份全称,如 Janualy

dd: 日,2位数表示,如02

d: 日,1-2位显示,如 2

EEE: 简写星期几,如Sun

EEEE: 全写星期几,如Sunday

aa: 上下午,AM/PM

H: 时,24小时制,0-23

K: 时,12小时制,0-11

m: 分,1-2位

mm: 分,2位

s: 秒,1-2位

ss: 秒,2位

S: 毫秒

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

-(void)sayHi;

@end


Person.m

#import "Person.h"

//一个类的延展,现在是对Person类进行延展
//延展类的声明在.m文件里
@interface Person (){
//定义私有变量
NSString * _gender;
}

-(void)privateTest;

@end

@implementation Person

-(void)sayHi{
NSLog(@" wo jiao person");
//私有方法有可能是我们对外公开方法功能模块的一小部分
[self privateTest];
}

-(void)privateTest{
NSLog(@"这是一个私有方法");
}

@end


NSString+SayHi.h

#import <Foundation/Foundation.h>

@interface NSString (SayHi)
-(void)sayHi;
@end


NSString+SayHi.m

#import "NSString+SayHi.h"

@implementation NSString (SayHi)
-(void)sayHi{
NSLog(@"%@ say Hi",self);
}
@end


NSString+Invert.h

#import <Foundation/Foundation.h>

@interface NSArray (Invert)
-(void)reverseLogArray;
@end


NSString+Invert.m

#import "NSString+Invert.h"

@implementation NSArray (Invert)
-(void)reverseLogArray{

for (NSInteger i = [self count]-1; i>=0; i--) {
NSLog(@"%@",self[i]);
}
}

@end


MarryProtocol.h

#import <Foundation/Foundation.h>

@protocol MarryProtocol <NSObject>

//默认是required,有它修饰的方法必须实现
@required
-(void)makeMoney;
-(void)careMe;
-(void)cookie;

//@optional 有它修饰的实现与否都可以
@optional
-(void)doAll;

@end


Boy.h

#import <Foundation/Foundation.h>
#import "MarryProtocol.h"

@interface Boy : NSObject<MarryProtocol>

@end


Boy.m

#import "Boy.h"

@implementation Boy

-(void)makeMoney{
NSLog(@"我会挣钱");
}

-(void)careMe{
NSLog(@"我会照顾人");
}

-(void)cookie{
NSLog(@"我会做饭");
}

-(void)doAll{
NSLog(@"我都会做");
}

@end


Girl.h

#import <Foundation/Foundation.h>
#import "MarryProtocol.h"

//遵循协议语法:
@interface Girl : NSObject <MarryProtocol>{
//找一个男朋友
id<MarryProtocol> _boyFrind;
}
//上班
-(void)doWork;
//消费
-(void)shopping;
//吃饭
-(void)eat;
//撒娇
-(void)coquetry;
//感到幸福
-(void)feelHappy;

-(void)setBoyFriend:(id<MarryProtocol>)boyFriend;
-(id<MarryProtocol>)boyFriend;

@end


Girl.m

#import "Girl.h"

@implementation Girl

-(void)setBoyFriend:(id<MarryProtocol>)boyFriend{
_boyFrind=boyFriend;
}
-(id<MarryProtocol>)boyFriend{
return _boyFrind;
}

//上班
-(void)doWork{
NSLog(@"我是UI设计师,我在北京一家公司上班");
}
//消费
-(void)shopping{
NSLog(@"我没衣服穿了,想要去优衣库");
[_boyFrind makeMoney];
}
//吃饭
-(void)eat{
NSLog(@"我饿了");
[_boyFrind cookie];
}
//撒娇
-(void)coquetry{
NSLog(@"我会撒娇");
NSLog(@"受不了你了!");
}
//感到幸福
-(void)feelHappy{
NSLog(@"感到稳稳地幸福");
}

@end


man.h

#import <Foundation/Foundation.h>
#import "MarryProtocol.h"

@interface Man : NSObject<MarryProtocol>

@end


man.m

#import "man.h"

@implementation Man

-(void)makeMoney{
NSLog(@"给你100W,花去吧");
}

-(void)careMe{
NSLog(@"去我的劳斯莱斯谈谈人生吧");
}

-(void)cookie{
NSLog(@"走,去吃满汉全席吧");
}

-(void)doAll{
NSLog(@"阿斯蒂芬");
}

@end


main.m

#import <Foundation/Foundation.h>
#import "NSString+SayHi.h"
#import "NSString+Invert.h"
#import "Person.h"
#import "Girl.h"
#import "Boy.h"
#import "man.h"

int main(int argc, const char * argv[]) {

//-----1--NSDate -------
//NSDate的定义
NSDate * nowDate = [NSDate date];

//日期的加减运算 dateByAddingTimeInterval
nowDate = [nowDate dateByAddingTimeInterval:8 * 60 * 60];
NSLog(@"nowDate = %@",nowDate);

//-----2--NSDateFormatter-------

//设置时间格式 时间转换为字符串格式
//NSDateFormatter的定义
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"dd/MM/yyyy HH:mm:ss "];
NSString *dateStr = [df stringFromDate:nowDate];
NSLog(@"dateStr = %@",dateStr);

//NSTimeInterval ⽤以表示以秒为单位的时间间隔,类型为double
NSDate * tomorrowDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24];
NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-60 * 60 * 24];
NSLog(@"%@",tomorrowDate);
NSLog(@"%@",yesterday);

NSTimeInterval ti = [tomorrowDate timeIntervalSinceDate:yesterday];
NSLog(@"ti = %.f s",ti);

/*
计算当前时间和⼀个固定时间的差值,如果差值在60秒内,输出“刚刚”,如果在60秒外3600秒内,输出“xx分钟前”,如果3600秒外,3600*24秒内,输出“xx小时前”
*/
NSDate * nd = [[NSDate alloc]init];
NSLog(@"nd = %@",nd);
NSDate * bd1 = [NSDate dateWithTimeIntervalSinceNow:50];
NSDate * bd2 = [NSDate dateWithTimeIntervalSinceNow:60*25];
NSDate * bd3 = [NSDate dateWithTimeIntervalSinceNow:60*60*25];

NSTimeInterval ti2 = [nd timeIntervalSinceDate:bd1];
NSTimeInterval ti3 = [nd timeIntervalSinceDate:bd2];
NSTimeInterval ti4 = [nd timeIntervalSinceDate:bd3];
NSLog(@"ti3 = %.f",ti3);
NSLog(@"ti4 = %.f",ti4);

if (ti2<=60) {
NSLog(@"刚刚");
}else if (ti2<=3600 && ti2 >60){
NSLog(@"%.f 分钟以内" ,ti2/60);
}else if (ti2<=3600*24 && ti2 >3600){
NSLog(@"%.f 小时内 ",ti2/3600);
}else{
NSLog(@"%.f 天之外",ti2/(3600*24));
}

//字符串转换为NSDate(转换后比原来小8个小时)
NSString * dateStr2 = @"2015*08*18_10";
NSDateFormatter * df2 = [[NSDateFormatter alloc]init];
[df2 setDateFormat:@"yyyy*MM*dd_HH-mm-ss"]; //这里格式要和字符串一模一样
//转换
NSDate * date = [df2 dateFromString:dateStr2];
NSLog(@"date = %@",date);

//获得当前时区
NSTimeZone * zone1 = [NSTimeZone systemTimeZone];
NSTimeZone * zone2 = [NSTimeZone timeZoneForSecondsFromGMT:8];

NSLog(@"zone1 = %@",zone1);
NSLog(@"zone2 = %@",zone2);

//获得所有时区
//    NSArray * zones = [NSTimeZone knownTimeZoneNames];
//    NSLog(@"zones = %@",zones);

//设置时区
[df2 setTimeZone:zone1];
NSLog(@"df2 = %@",df2);

/*
练习2
定义一个NSDateFormatter,设置合适的格式
将字符串@“2014年05月01日 10点23分18秒”转换为NSDate对象
*/
NSString * datestr3 = @"2014年05月01日 10点23分18秒";
NSDateFormatter * df3 = [[NSDateFormatter alloc]init];
[df3 setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
NSDate * date3 = [df3 dateFromString:datestr3];
NSLog(@"date3 = %@",date3);

//-----2--Category 类  类目-------
//类的扩展Category 叫分类也叫类目
//主要作用是为没有源代码的类添加方法,对原有类的一个扩展·
//通过Category添加的方法会成为原类的一部分
//优点:Category 不能完全替代继承,但能做许多继承做不了的事情,虽然写起来麻烦一点,但是用起来方便横多
//缺点:Category 只能扩展方法、消息,不能扩展字段、变量等。
/*
类和继承的区别
功能:Category 只能为类添加方法,而继承可以添加方法也可以添加实例变量
特点:Category 添加的类会成为原始类的一部分,能被子类继承;继承添加的类只有子类才有,父类不具有;
使用:
*/
NSString * str1 = @"学辉";
[str1 sayHi];

NSArray *arr1 = @[@"a",@"b",@"c",@"d",@"e",@"r"];
[arr1 reverseLogArray];

//-----3--Extension 延展-------
/*Category 和 Extension 的区别
作用:Category为没有源代码的类添加方法,Extension管理类的私有方法
格式:定义一对.h 和 .m  Extension把代码写到原始类的.m文件中
*/

//创建一个person的实例
Person *p = [[Person alloc]init];
[p sayHi];

//-----4--Protocol 协议(谁遵守,谁实现)-------
Girl * girl1 = [[Girl alloc]init];
Boy * boy1 = [[Boy alloc]init];
NSLog(@"girl1 = %@",girl1);
NSLog(@"boy1 = %@",boy1);

//    [boy1 makeMoney];
//    [boy2 careMe];
//    [boy3 cookie];
//    [boy4 doAll];

//-----5--delegate 设计模式-----------
//Protocol的核心使用场景是实现delegate设计模式,凡是默写任务自己不去实现,想让别人去实现的时候,就可以指定一个代理,让代理帮去做。只要通知代理去做某事就行。
//现在公司有一个女孩子
Girl * girl2 = [[Girl alloc]init];
[girl2 doWork];

//公司又来了一个男孩子
Boy * boy2 = [[Boy alloc]init];

//这个男孩子对女孩子很好,然后他们在一起了
[girl2 setBoyFriend:boy2];

//当女孩饿了,男孩会给她做饭
[girl2 eat];

//当女孩要去购物了,男孩会给他好多钱
[girl2 shopping];

//当女孩给男孩撒娇的时候
[girl2 coquetry];

//---这个男孩子太。。。了,她终于忍受不了对方,分开了,这时候来了一个成熟稳重的男人,这个男人对她挺好

Man * man = [[Man alloc]init];
[girl2 setBoyFriend:man];

//当女孩饿了,男孩会给她做饭
[girl2 eat];

//当女孩要去购物了,男孩会给他好多钱
[girl2 shopping];

//当女孩给男孩撒娇的时候
[girl2 coquetry];

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: