您的位置:首页 > 编程语言 > C语言/C++

OC语言类的扩展

2015-07-27 09:06 453 查看
// setValue和setObject的区别
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"1",@"2",@"3",@"4",@"5",@"6", nil];
// 当用setValue时,如果前边value里放的是一个空值nil,那么这个方法会被removeForKey代替 即删除一对键值对
[dic setValue:nil forKey:@"2"];
NSLog(@"%@", dic);
// 而setObject并不能实现此功能 如果遇到这种情况(值为nil) 会崩溃
[dic setObject:nil forKey:@"2"];
NSLog(@"%@", dic);


类目 category

// 系统已经写好的类目:按照功能对系统的类方法进行区分
// 类目从@interface开始,后面是当前类的名字,类名后是分类的功能,到@end结束
// 我们创建的类目,一般是为了把一些系统的类进行功能扩充
// 自己加入的NSString方法
// 这里str赋空值时不会执行此方法 @""可以 里边有元素\0
NSDate *date1 = [NSDate dateWithString:@"2014-08-14 18:00:00"];
NSTimeInterval time = 3600;
date1 = [NSDate dateWithTimeInterval:time sinceDate:date1];
NSLog(@"%@", date1);

NSString *str1 = @"2014-08-14 18:00:00";
NSString *str2 = @"2014-08-14 20:00:00";
NSString *strTest = [str1 substringFromIndex:12];
NSLog(@"%@", strTest);
// 判断两个时间是否相同
BOOL isTrue = [str1 judgeTwoDate:str2];
NSLog(@"%d", isTrue);
// 将两个时间拼接成一个时间段
NSString *str0 = [str1 appendTwoDate:str2];
NSLog(@"%@", str0);
// 判断一个时间是否在这个时间段内
NSString *str = @"2014-08-14 18:46:30";
BOOL T = [str judgeInTimeZone:str1 end:str2];
NSLog(@"%d", T);

// 将字符串形式转化为NSDate形式输出
// 这里str一定要是@"yyyy-MM-dd hh:mm:ss"形式
// hh表示12小时制,HH表示24时制
NSDate *date = [str stringToDate];
NSLog(@"%@", date);
NSDate *date0 = [NSString stringToDate:str];
NSLog(@"%@", date0);


/*
*  NSString+StringMethod.h
*/
@interface NSString (StringMethod)

- (void)sayHi;

// 输入两个日期,判断两个日期是否在同一个月
// 这个方法需要两个参数,第一个参数就是方法的调用者,谁调用了这个方法,那么在这个方法内部,self就是使用方法的那个对象
- (BOOL)judgeTwoDate:(NSString *)anotherDate;

- (NSString *)appendTwoDate:(NSString *)anotherDate;

// 给定两个时间,判断时间是否在这两个时间区间内
- (BOOL)judgeInTimeZone:(NSString *)beginTime
end:(NSString *)endTime;

// 传过去一个字符串,返回一个时间的对象NSDate类型
- (NSDate *)stringToDate;
+ (NSDate *)stringToDate:(NSString *)dateStr;

@end


/*
*  NSString+StringMethod.m
*/
@implementation NSString (StringMethod)

- (void)sayHi
{
NSLog(@"你好");
}

- (BOOL)judgeTwoDate:(NSString *)anotherDate
{
return [[self substringWithRange:NSMakeRange(5, 2)] isEqualToString:[anotherDate substringWithRange:NSMakeRange(5, 2)]];
}

- (NSString *)appendTwoDate:(NSString *)anotherDate
{
if ([[self substringToIndex:11] isEqualToString:[anotherDate substringToIndex:11]]) {
NSString *endDate = [anotherDate substringFromIndex:11];
NSLog(@"%@", endDate);
return [NSString stringWithFormat:@"%@ - %@", self, endDate];
} else {
return NO;
}
}

// 这种方法称为私有方法,不让类外部去使用,只能类内部去使用
- (void)shangshuai
{
NSLog(@"我是商帅");
}

- (BOOL)judgeInTimeZone:(NSString *)beginTime
end:(NSString *)endTime
{
NSString *timeZone = [beginTime appendTwoDate:endTime];
if ([[self substringToIndex:11] isEqualToString:[timeZone substringToIndex:11]]) {
NSInteger timeA = [[self substringWithRange:NSMakeRange(11, 2)] intValue];
NSInteger timeB = [[beginTime substringWithRange:NSMakeRange(11, 2)] intValue];
NSInteger timeC = [[endTime substringWithRange:NSMakeRange(11, 2)] intValue];
if (timeA <= timeC && timeA >= timeB) {
return YES;
} else {
return NO;
}
} else {
return NO;
}
}

- (NSDate *)stringToDate
{
// 设置格式
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
return [formatter dateFromString:self];
}
+ (NSDate *)stringToDate:(NSString *)dateStr
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
return [formatter dateFromString:dateStr];
}

@end


/*
*  Student.h
*/
@interface Student : NSObject

@property(nonatomic, copy)NSString *stuSex;

@end


延展Extension

/*
*  Student.m
*/
// 延展以@interface开头,然后写当前的类名,最后加一个(),到@end结束
// 一般延展会写在自己写的.m文件中,把一些不想让别人外部调用的属性放在延展里,这样这条属性只能在类的内部使用,外部使用不了,尽最大的可能保护当前类的安全
// 类目一般都是给看不见.m的系统文件进行扩展,延展一般都是针对自己的类进行操作
@interface Student ()

@property(nonatomic, copy)NSString *name;

@end

@implementation Student

- (void)create
{
_name = @"王二麻子";
NSLog(@"%@", _name);
}

@end


协议Protocol

/*
*  girl.h
*/
// 1.声明一份协议
// @protocol 协议的关键词 在@interface的上面书写

@protocol Marry <NSObject>
// 协议的内容
// 协议方法的声明

// @required是必须实现的方法,为系统默认
- (void)makeMoney;

// optional可选择执行的方法
@optional
- (void)cook;

@end

@interface Girl : NSObject

// 2.设置代理人(delegate)的属性
@property(nonatomic, assign)id<Marry>delegate;

// 两个人结婚之后,协议才正式生效
- (void)getMarry;

@end


/*
*  girl.m
*/
@implementation Girl

- (void)getMarry
{
// 3.让代理人去执行协议里的方法
[self.delegate makeMoney];
}

@end


#import "Girl.h"
// 4.引完头文件之后,boy需要签订协议

@interface Boy : NSObject<Marry>

- (void)makeMoney;

@end


// 创建两个对象
Boy *yadang = [[Boy alloc] init];
Girl *xiawa = [[Girl alloc] init];

// 5.设置代理人
xiawa.delegate = yadang;

// 通过调用结婚的方法,来执行内部的协议方法
[xiawa getMarry];   //  与[yadang makeMoney]执行操作相同
// 如果想更改执行的代理人 只需重新定义一个类 执行4,5,6步即可


@implementation Boy
// 6.实现协议方法makeMoney

- (void)makeMoney
{
NSLog(@"买买买");
}

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