OC: 类的扩展、类的延展、协议、 NSDate

时间:2024-06-22 00:07:56
 

NSDateFormatter

指定⽇日期格式:
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

⽇日期转化为字符串:
NSDateFormatter*formatter =
[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSString *date
String=[formatter stringFromDate: [NSDate date]]; 

NSDate 处理日期或者时间的一个类,用于获取日期

NSDate * date = [NSDate date];//是个类方法

全球份24个时区,我们控制台打印的是0时区的时间

//获取当前的日期时间

NSDate * date = [NSDate date];//是个类方法全球份24个时区,我们控制台打印的是0时区的时间

NSLog(@"%@",date);

//获取明天此时的时间 ,计算明天距离此时的时间,以及本单位秒来计算的

NSDate * date1 = [NSDate dateWithTimeIntervalSinceNow:24*60*60];

NSLog(@"tomorrow = %@",date1);

//获取昨天的日期

NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-24*60*60];

NSLog(@"yesterday = %@",yesterday);

dateWithTimeIntervalSinceNow方法

//获取1970.1.1到此时的时间间隔

NSTimeInterval timeInterval = [datenow timeIntervalSince1970];

NSLog(@"%f",timeInterval);//结果是以秒为单位

//获取两个日期的时间间隔

NSTimeInterval interval = [datenow timeIntervalSinceDate:tomorrow];//用前面日期 - 后面的日期 (datenow - tomorrow)以秒为单位

NSLog(@"%f",interval);

NSLog(@"获取两个日期的时间间隔 %.1f 天",interval/24/60/60);//计算相差天数

//获取据当前日期的时间间隔

NSTimeInterval currentInterval = [yesterday timeIntervalSinceNow];

NSLog(@"据当前日期的时间间隔 %.1f 天",currentInterval/24/60/60);

//两个日期之间的比较(返回一个枚举值)默认是升序比较

NSComparisonResult result = [yesterday compare:tomorrow];

NSLog(@"%ld",result);

//判断两个日期是否相等(返回BOOL值)

BOOL isEqual = [tomorrow isEqualToDate:yesterday];

if (isEqual) {

NSLog(@"两个日期相等");

}else{

NSLog(@"两个日期不相等");

}

//练习 控制台输入一个时间间隔 如果据此时差值在60秒 就提示“刚刚”  如果在60秒之外小于3600秒 就提示“XX 分钟前”,如果大于 3600 秒 就输出 “XX 小时前”

NSTimeInterval time = 0;

printf("请输入时间");

scanf("%lf",&time);

if (time < 60) {

NSLog(@"刚刚");

}

if(time > 60 && time < 3600){

NSLog(@"%.f分钟前",time/60);

}

if (time > 3600) {

NSLog(@"%.f小时前",time/60/60);

}

时区的转化那点事       http://my.oschina.net/yongbin45/blog/151376

下午所学:

分类:1.作用是为不知道源代码的类提供方法(扩展功能)

2. 分类并不是一个类,只是为我们原有的类扩展功能,就是添加方法,而且只能添加方法,不能添加实例变量

cmd + ctrl +方向键 对(.h 与 .m文件的切换)

对于分类的使用,也需要在主文件里导入

Extension 与 category 的区别:前者是一个类的私有方法,后者是为不知道源代码的类的方法的扩展

1.制定协议内容

2.设置代理人对象

3.制定代理人

4.代理人对象服从协议

5.代理人实现协议中的方法

6.通知代理人执行

//笑笑糖语法只能给不可变数组用

//代理delegate

 //
// main.m
// Protocol(协议)
//
// #import <Foundation/Foundation.h>
#import "Man.h"
#import "Woman.h"
#import "BabySister.h"
#import "Mother.h" //1.制定协议
//2。对象遵循协议
//3.设置代理人
//4.代理人实现协议中的方法
//5.通知代理人去执行
//6.代理人去执行协议
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"故事开始, World!");
NSLog(@"在某一天,一个风尘仆仆的美男子,出现在一个漆黑的夜晚....");
NSLog(@"突然...");
NSLog(@"前面出现了一个美如天仙的如花姑娘。。。");
NSLog(@"很快,两人就这样认识了");
NSLog(@"很快,两人就步入了婚姻的殿堂");
Woman *honey = [[Woman alloc]initWithName:@"shuhao" age:@""];
Man *man = [[Man alloc]initWithName:@"pengpeng" age:@""];
NSLog(@"shuhao:你要是帮我做这几件事,我就嫁给你");
NSLog(@"pengpeng :I DO");
//设置代理人
[honey setDelegate:man];
//通知代理人执行
[honey comeon]; Mother * mother = [[Mother alloc]initWithName:@"mom" age:@""];
BabySister * sister = [[BabySister alloc]initWithName:@"xiao" age:@""]; }
return ;
}

main.m 文件

 //
// Man.h
// Protocol(协议)
//
// #import "Person.h"
#import "Woman.h" //代表 Man 这个类服从 MarriageDeal 的协议
@interface Man : Person<MarriageDeal>//一个类服从某协议的写法
//履行协议
- (void)cook;
- (void)doHousework;
- (void)makeABaye;
@end

man.h 文件

//
// Man.m
// Protocol(协议)
// #import "Man.h" @implementation Man
//履行协议
- (void)cook{
NSLog(@"给老婆做饭吃");
}
- (void)doHousework{
NSLog(@"给老婆做家务,不容易啊");
}
- (void)makeABaby{
NSLog(@"好吧,做个玩具娃娃");
}
@end

man.m 文件

 //
// Woman.h
// Protocol(协议)
//
// #import "Person.h"
//婚前约定(
//做饭 做家务 生孩子
@protocol MarriageDeal <NSObject>
//@required 是必须实现的方法(只要其他的类遵循这个协议那就必须去做)
//@optional 是可以选择实现的方法
@required//强制必须做的
- (void)cook;
- (void)doHousework;
@optional//可选做的,可实现,也可以不实现
//协议的默认状态是@required
- (void)makeABaby;
@end @interface Woman : Person
{
//代理
id<MarriageDeal>_delegate;//设置代理对象
//<协议名> 代表代理服从协议
//谁去执行谁就是代理
//< > 里面是协议
//id就是可以代之所有的对象 }
//为代理写setter 方法
- (void)setDelegate:(id)delegate;
//通知代理人去是实现对应的方法
- (void)comeon;
@end

woman.h 文件

 //
// Woman.m
// Protocol(协议)
//
// #import "Woman.h" @implementation Woman
//为代理写setter 方法
- (void)setDelegate:(id)delegate{
_delegate = delegate;
}
//通知代理人去是实现对应的方法
- (void)comeon{
if (_delegate) {
[_delegate cook];
[_delegate doHousework];
[_delegate makeABaby];
}
}
@end

woman.m 文件

 //
// Person.h
// Protocol(协议)
//
// #import <Foundation/Foundation.h> @interface Person : NSObject
{
NSString *_name;
NSString *_age;
}
//初始化方法
- (id)initWithName:(NSString *)name
age:(NSString *)age; @end

person.h文件

 //
// Person.m
// Protocol(协议)
//
// #import "Person.h" @implementation Person
//初始化方法
- (id)initWithName:(NSString *)name
age:(NSString *)age{
self = [super init];
if (self) {
_name = name;
_age = age;
}
return self;
}
@end

person.m文件

// 分类 category

 //
// main.m
// Category
//
// #import <Foundation/Foundation.h>
#import "NSString+Addition.h"
#import "NSDictionary+Addition.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
//category 分类 类目 为不知道源代码的一些类(系统的类)来扩充功能
NSString * str = @"HHH";
[str sayHi];
//只能添加方法
//为 NSString 扩充方法 :获取字符串的首字母并大写
NSString * oneFirst = [str getFirstCharacter];
NSLog(@"%@",oneFirst);
NSString * dataSet = @"";
NSString * new = [dataSet change];
NSLog(@"%@",new);
NSString * strr = @"";
[strr stringToValue];
NSInteger b = ;
NSString * new2 = [dataSet transToString:b];
NSLog(@"%@",new2);
NSDictionary * dic = @{@"Y":@"Yob",@"N":@"niu",@"Z":@"Zhang"};
NSArray * keys = [dic allKeysOrdered];
NSLog(@"%@",keys); }
return ;
}

main.m

 //
// NSString+Addition.h
// Category
//
// #import <Foundation/Foundation.h> //分类:1.作用是为不知道源代码的类提供方法(扩展功能)
// 2. 分类并不是一个类,只是为我们原有的类扩展功能,就是添加方法,而且只能添加方法,不能添加实例变量
@interface NSString (Addition)
- (void)sayHi;
//获取字符串的首字母并以大写的形式
- (NSString *)getFirstCharacter;
//把对应的字符串日期转化为特定的形式@"20150819"--@"2015.08.19"
- (NSDate *)change;
//把基本整型转化为字符串类型
- (NSString *)transToString:(NSInteger)num;
//把字符串转化为基本的整型
- (NSInteger)stringToValue; @end

NSString+Addition.h

 //
// NSString+Addition.m
// Category
//
// #import "NSString+Addition.h" @implementation NSString (Addition)
- (void)sayHi{
NSLog(@"我是一个分类的方法");
}
//获取字符串的首字母并以大写的形式
- (NSString *)getFirstCharacter{
// capitalizedString 让首字母大写
// return [[self substringToIndex:1]capitalizedString];
// uppercaseString 是让字母全部大写
return [[self substringToIndex:]uppercaseString];
}
//把对应的字符串日期转化为特定的形式@"20150819"--@"2015.08.19"
- (NSString *)change{
NSMutableString * newStr = [NSMutableString stringWithString:self];
if ([self length] < ) {
NSLog(@"长度不够");
}else{
NSString *str = @"/";
[newStr insertString:str atIndex:];
[newStr insertString:str atIndex:];
}
return newStr;
}
//把基本整型转化为字符串类型
- (NSString *)transToString:(NSInteger)num{
return [NSString stringWithFormat:@"%lu",num ];
}
//把字符串转化为基本的整型
- (NSInteger)stringToValue{
return [self integerValue];
}
@end

NSString+Addition.m

 //
// NSDictionary+Addition.h
// Category
//
// #import <Foundation/Foundation.h> @interface NSDictionary (Addition)
//获取所有的key值然后给key排序然后返回给我们
- (NSArray *)allKeysOrdered;
@end

NSDictionary+Addition.h

 //
// NSDictionary+Addition.m
// Category
//
// #import "NSDictionary+Addition.h" @implementation NSDictionary (Addition)
//获取所有的key值然后给key排序然后返回给我们
- (NSArray *)allKeysOrdered{
//
// NSArray * allkeys = [self allKeys];
// NSArray * sort = [allkeys sortedArrayUsingSelector:@selector( compare:)];
// return sort;
//
// return [[self allKeys]sortedArrayUsingSelector:@selector(compare:)];
//
return [[self allKeys]sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
}
@end

NSDictionary+Addition.m

//延展(Extension)

 //
// main.m
// 08-19(延展)
//
// #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
Person * per = [[Person alloc]init];
//下面的两个方法不可见的
//[per saygoodbye]; 在这里不能被调用,只能在类的内部使用
//[per introduce];
[per test]; }
return ;
}

main.m

 //
// Person.h
// 08-19(延展)
//
// #import <Foundation/Foundation.h> //.h文件声明实例变量和方法 用于为外界提供接口
//.m文件具体实现方法
@interface Person : NSObject
- (void)test;
@end

person.h

 //
// Person.m
// 08-19(延展)
//
// #import "Person.h" //在 Person.m 文件里添加一个 延展
@interface Person ()
{
//私有的实例变量,仅仅是内部访问的
NSString * _age;
CGFloat _height;
}
//下面的方法声明注释掉,下面一样可以实现,所以对于私有的方法可以直接在内部实现
//- (void)saygoodbye;
//- (void)introduce;
@end
//延展 Extension 主要是在 .m文件里面 为一个类添加私有的方法和实例变量,这些实例变量和方法就只能供应自己使用,外界不能使用
@implementation Person
- (void)test{
_age = @"";
NSLog(@"测试。。");
[self saygoodbye];
[self introduce];
}
- (void)saygoodbye{
NSLog(@"goodbye");
}
- (void)introduce{
NSLog(@"我年龄是 %@ 岁",_age);
}
@end

person.m

.h文件声明实例变量和方法 用于为外界提供接口

.m文件具体实现方法

Category 1.分类是为一些没有源代码的类里面添加一些,源代码里没有实现的方法   2.注意他的文件的创建  3.分类用于我们向该类添加方法,而且只能是添加方法,不能再往里面添加实例变量。添加一个分类后的文件是

@implementation NSString (Addition)//注意这里的写法(这是系统自动生成的)  注意那个分类的创建步骤,记住

@end

1.延展 是管理类的私有方法,把代码写到原始的 .m文件里面

延展吧一个方法用到的实例变量(这里是当前类就是私有的了)的声明,与实现都写在一个类(当前类里面),也就是@interface@end 与@implementation @end写在一起。延展 Extension 主要是在 .m文件里面 为一个类添加私有的方法和实例变量,这些实例变量和方法就只能供应自己使用,外界不能使用

注意:为一个类添加一些私有变量的写法 如Person类里面添加两个私有变量

#import "Person.h"

@interface Person ()//这里要注意与普通定义的区别

{

NSString * _group;//家族背景

NSString *_sattion;//社会地位

}

@end

@implementation Person

@end

注意:私有变量里面定义的方法可以吧方法的声明省去,直接在@implementation @end里面实现

protocol 1.协议是iOS开发中常⽤的技术。

协议是⼀套标准(⼀堆⽅法的声明),只有.h⽂件。就像⼀张任
务清单(或便利贴),上⾯写了⼀堆需要处理的事。清单交给谁,
谁就要去完成清单上规定的任务。
接受协议的对象实现协议中定义的⽅法。即:清单交给谁,谁就
要去完成清单上规定的任务。

协议中方法的类型有 @optional 代理者可做可不做的         @required  代理者必须做的

协议protocol的定义的格式要注意,他是在@interface @end的@interface的上面写以 @protocol  方法清单 @end 书写

 

//获取字符串的首字母并以大写的形式

- (NSString *)getFirstCharacter{

//    capitalizedString 让首字母大写

//    return [[self substringToIndex:1]capitalizedString];

//    uppercaseString 是让字母全部大写

return [[self substringToIndex:1]uppercaseString];

}

NSString * str = @"123";     [str integerValue]; 把字数字符串转化为整型数字