//
// main.m
// CategoryExtensionProtocol
//
// Created by lanouhn on 15/5/2.
// Copyright (c) 2015年 lanouhn. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NSMutableDictionary+Sequence.h"
#import "NSDate+DateWithString.h"
#import "Person.h"
#import "Teacer.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//***********************************************************************
/*
Category也叫分类或类目
主要作⽤是为没有源代码(已知类或者自己创建的类)的类添加方法但是不能添加实例变量。
通过Category添加的方法会成为原类的一部分。从而达到扩展一个类的功能。
*/
/*
新建文件
选择Objective-C Category模板
填写类名和分类名
.h⽂文件添加⽅方法声明
.m添加⽅方法实现
*/
//分类(类目)只是为类扩充方法,不能扩充实例变量
//分类并不是类,只是为原来的类扩充功能
//类目的优先级要高于系统的优先级,如果和系统相同,会顶替系统
//***********************************************************************
//为NSMutableDictionary添加一个排序方法,用来完成对字典所有key的排序(Category类目方法)
// NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"zhengzhou",@"henan",@"wuhan",@"hubei",@"changshan",@"hunan",@"dali",@"yunnan",@"qingdao",@"shandong", nil];
// [dic sequence];
// NSLog(@"%@",dic);
//使⽤Category为NSDate类添加一个类方法 (dateWithDateString:),实现将下述字符串转换为NSDate对象。将@“20140402142850”转换为NSDate。
// NSDate *date = [[NSDate alloc] init];
// NSString *string = @"20140402142850";
// [date dateWithString:(string)];
//***********************************************************************
//延展:可以为我们自定义的类添加实例变量和方法,只不过通过延展添加的实例变量和方法是私有的,只能允许本类访问,外界无法访问
//通过延展添加的方法和实例变量存在于 .m 文件中
//延展的作用:隐藏一些不想让外界知道的一些操作。
//***********************************************************************
//创建一个Person类
// Person *person = [[Person alloc] initWithName:@"anni" gender:@"woman" age:18];
// [person sayHi];
//***********************************************************************
/* Protocol(协议),是iOS开发中常用的技术。
协议是一套标准(一堆方法的声明),只有.h文件。就像一张任务清单(或便利贴),上面写了一堆需要处理的事。清单交给谁,
谁就要去完成清单上规定的任务。
接受协议的对象实现协议中定义的⽅方法。即:清单交给谁,谁就
要去完成清单上规定的任务。
*/
//协议文件是一个 .h 文件
//协议中存放的是一系列方法的声明
//"<>"表示服从协议。Hobby现在服从NSobject协议中一系列的协议方法
//协议中放的是方法的声明,服从该协议的类负责实现协议中得内容
//协议中方法分为两种 1:必须实现@required 2:选择实现@optional
//***********************************************************************
// Teacer *teacer = [[Teacer alloc] init];//协议
// [teacer eatFood];
//***********************************************************************
/*代理 以结婚为例
1:创建协议方法(谁需要制定协议就在谁的.h文件中创建)
2:创建代理人这个职位
3:代理人服从协议,并且实现协议方法
4:添加代理人
5:协议方法调用
*/
//首先创建两个类
Boy *boy = [[Boy alloc] initWithName:@"狂飙" gender:@"男" age:25];
[boy marry];
}
return 0;
}
类文件如图
NSMutableDictionary+Sequence
#import <Foundation/Foundation.h>
@interface NSMutableDictionary (Sequence)
- (void)sequence;
@end
#import "NSMutableDictionary+Sequence.h"
@implementation NSMutableDictionary (Sequence)
//为NSMutableDictionary添加一个排序方法,用来完成对字典所有key的排序(Category类目方法)
- (void)sequence{
NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
[array addObject: [self allKeys]];
[array sortUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
return [obj1 compare:obj2];
}];
}
@end
NSDate+DateWithString
#import <Foundation/Foundation.h>
@interface NSDate (DateWithString)
- (void)dateWithString:(NSString *)string;
@end
#import "NSDate+DateWithString.h"
@implementation NSDate (DateWithString)
//使⽤Category为NSDate类添加一个类方法 (dateWithDateString:),实现将下述字符串转换为NSDate对象。将@“20140402142850”转换为NSDate。
- (void)dateWithString:(NSString *)string{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMddHHmmss"];
NSDate *date = [formatter dateFromString:string];
NSLog(@"%@",date);
}
@end
Person
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
NSString *_gender;
NSInteger _age;
}
@property NSString *name;
@property NSString *gender;
@property NSInteger age;
- (void)sayHi;
- (id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age;
@end
#import "Person.h"
//延展:可以为我们自定义的类添加实例变量和方法,只不过通过延展添加的实例变量和方法是私有的,只能允许本类访问,外界无法访问
//通过延展添加的方法和实例变量存在于 .m 文件中
//延展的作用:隐藏一些不想让外界知道的一些操作。
@interface Person (fuck)
//- (void)fuckYou;
@end
@implementation Person
- (id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age{
self = [super init];
if (self) {
_name= name;
_gender = gender;
_age = age;
}
return self;
}
- (void)fuckYou{
NSLog(@"骂人");
}
- (void)sayHi{
NSLog(@"大家好,我叫%@",self.name);
[self fuckYou];
}
@end
Hobby
#import <Foundation/Foundation.h>
@protocol Hobby <NSObject>
@required//默认的,必须执行
- (void)eatFood;
- (void)sleep;
@optional//选择执行
- (void)beatDouDou;
@end
Teacer
#import <Foundation/Foundation.h>
#import "Hobby.h"
@interface Teacer : NSObject<Hobby>
@end
#import "Teacer.h"
@implementation Teacer
//必须执行
- (void)eatFood{
NSLog(@"吃饭");
}
- (void)sleep{
NSLog(@"睡觉");
}
//选择执行
- (void)beatDouDou{
NSLog(@"打豆豆");
}
@end
Girl
#import <Foundation/Foundation.h>
//1:创建协议方法(谁需要制定协议就在谁的.h文件中创建)
@protocol MarryDelegate <NSObject>
//协议方法默认必须实现
- (void)cook;
- (void)washCloth;
- (void)makeMoney;
@end
@interface Girl : NSObject
{
NSString *_name;
NSString *_gender;
NSInteger _age;
//创建代理人
id<MarryDelegate> _delegate;
}
//为实例变量delegate添加setter方法
- (void)setDeledate:(id<MarryDelegate>)delegate;
@property (nonatomic) NSString *name;
@property (nonatomic) NSString *gender;
@property (nonatomic) NSInteger age;
- (id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age;
- (void)sendOrder;
@end
#import "Girl.h"
@implementation Girl
@synthesize name = _name;
@synthesize gender = _gender;
@synthesize age = _age;
//- (void)cook{
// NSLog(@"做饭");
//}
//- (void)washCloth{
// NSLog(@"洗衣服");
//}
//- (void)makeMoney{
// NSLog(@"挣钱");
//}
//为实例变量delegate添加setter方法
- (void)setDeledate:(id<MarryDelegate>)delegate{
_delegate = delegate;
}
- (id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age{
self = [super init];
if (self) {
_name = name;
_gender = gender;
_age = age;
}
return self;
}
//向男孩发号施令
- (void)sendOrder{
//5:协议方法的调用
[_delegate washCloth];
[_delegate cook];
[_delegate makeMoney];
}
@end
Boy
#import <Foundation/Foundation.h>
#import "Girl.h"
@interface Boy : NSObject<MarryDelegate>
{
NSString *_name;
NSString *_gender;
NSInteger _age;
}
//结婚
- (void)marry;
@property (nonatomic) NSString *name;
@property (nonatomic) NSString *gender;
@property (nonatomic) NSInteger age;
- (id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age;
@end
#import "Boy.h"
@implementation Boy
@synthesize name = _name;
@synthesize gender = _gender;
@synthesize age = _age;
- (id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age{
self = [super init];
if (self) {
_name = name;
_gender = gender;
_age = age;
}
return self;
}
- (void)cook{
NSLog(@"给老婆做饭");
}
- (void)washCloth{
NSLog(@"给老婆洗衣服");
}
- (void)makeMoney{
NSLog(@"给家里挣钱");
}
- (void)marry{
Girl *girl = [[Girl alloc] initWithName:@"如花" gender:@"女" age:50];
//添加代理人
[girl setDeledate:self];
[girl sendOrder];
}
@end
网友评论