类目-Category
作用:主要为没有源代码的类添加方法(比如系统的类)
定义Category
- 新建文件
- 选择OC Category模板
- 填写类和分类名
- 在.h中添加方法声明
- 在.m中添加方法实现
声明Category
NSString+StringMethod.h
@interface NSString (StringMethod)
- (void)sayHi;
@end
NSString+StringMethod.m
@implementation NSString (StringMethod)
- (void)sayHi
{
NSLog(@"hello");
}
@end
Category下代码练习
NSString+StringMethod.h
#import <Foundation/Foundation.h>
@interface NSString (StringMethod)
- (void)sayHi;
// 输入两个日期,判断两个日期是否在同一个月
- (BOOL)isEqualTwoDate:(NSString *)otherDate;
// 拼接两个日期
- (NSString *)appendTwoDate:(NSString *)otherDate;
- (BOOL)isInTimeZone:(NSString *)beginTime end:(NSString *)endTime;
// 传过去一个字符串,返回一个时间的对象NSDate类型
- (NSDate *)stringToDate;
+(NSDate *)stringToDate:(NSString *)dateStr;
@end
NSString+StringMethod.m
@implementation NSString (StringMethod)
- (void)sayHi
{
NSLog(@"hello");
}
- (BOOL)isEqualTwoDate:(NSString *)otherDate
{
// 这个方法需要两个参数,第一个参数就是方法的调用者,谁调用了这个方法,那么在这个方法的内部,self就是使用方法的那个对象
NSString *newStr = [self substringWithRange:NSMakeRange(5, 2)];
NSString *otherStr = [otherDate substringWithRange:NSMakeRange(5,2)];
// if (![newStr isEqualToString:otherStr]) {
// return NO;
// }
// return YES;
return [newStr isEqualToString:otherStr];
}
- (NSString *)appendTwoDate:(NSString *)otherDate
{
// NSString *newStr = [self stringByAppendingString:otherDate];
// return newStr;
// 先截取
NSString *newDate1 = [self substringToIndex:19];
NSString *newDate2 = [otherDate substringFromIndex:11];
NSString *str = [NSString stringWithFormat:@"%@-%@",newDate1,newDate2];
return str;
}
// 给定两个时间,判断时间是否在这两个时间区间内
// 需修改
- (BOOL)isInTimeZone:(NSString *)beginTime end:(NSString *)endTime
{
NSString *yearStr1 = [beginTime substringToIndex:4];
NSString *yearStr2 =[endTime substringToIndex:4];
NSString *selfYear = [self substringToIndex:4];
NSString *monthStr1 = [beginTime substringWithRange:NSMakeRange(5, 2)];
NSString *monthStr2 =[endTime substringWithRange:NSMakeRange(5, 2)];
NSString *selfMonth = [self substringWithRange:NSMakeRange(5, 2)];
NSString *dayStr1 = [beginTime substringWithRange:NSMakeRange(8, 2)];
NSString *dayStr2 =[endTime substringWithRange:NSMakeRange(8, 2)];
NSString *selfDay = [self substringWithRange:NSMakeRange(8, 2)];
if (selfYear >= yearStr1 && selfYear <= yearStr2) {
if (selfMonth >= monthStr1 && selfMonth <= monthStr2) {
if (selfDay >= dayStr1 && selfDay <=dayStr2) {
return YES;
}
}
}
return NO;
}
// 传过去一个字符串,返回一个时间的对象NSDate类型
- (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
注意:在.m里声明的方法称为私有方法,不让类外部去使用,只能类内部去使用,想让类外用的方法一概在.h里声明
延展-Extension
定义Extension
- 延展是以@interface开头,然后写当前延展的类名,类名后加一个(),到@end结束
- 一般延展会写在自己写的.m文件中,把一些不想让别人在外部调用的属性放在延展里,这样这条属性只能在类的内部使用,外部使用不了,尽最大的可能保护当前类的安全
- 类目一般都是给看不见.m的系统文件进行拓展,延展是一般是针对自己的类进行操作
xxx.m?文件
@interface xxx (ExtensionName) 你的方法列表
@end
@implementation xxx 方法的实现
@end
@interface Student ()
@property(nonatomic,copy)NSString *name;
@end
@implementation Student
- (void)create
{
_name = @"哈哈";
NSLog(@"%@",_name);
}
Category和Extension的区别
Category | Extension | |
---|---|---|
作用 | 为没有源代码的类添加方法 | 管理类的私有方法 |
格式 | 有一对.h.m | 写到原始类的.m |
协议-Protocol
- Protocol(协议),是iOS开发中常?用的技术。
- 协议是一套标准(一堆方法的声明),只有.h?文件。就像一张任 务清单(或便利贴),上面写了一堆需要处理的事。
- 清单交给谁,谁就要去完成清单上规定的任务。
实现协议的完整步骤:
Girl.h
#import <Foundation/Foundation.h>
// 1.声明一份协议
// protocol 协议的关键词
@protocol Marry <NSObject>
// 协议的内容
// 对应的方法的声明
// @required 是必须实现的方法,默认是必须实现的方法
// @optional 是可选择执行的方法
- (void)makeMoney;
@optional
- (void)cook;
@end
@interface Girl : NSObject
// 2.设置代理人的属性
@property(nonatomic,assign)id<Marry>delegate;
// 两个人结婚后,协议才正式的生效
- (void)getMarry;
@end
Girl.m
#import "Girl.h"
@implementation Girl
- (void)getMarry
{
// 3.让代理人去执行协议里的方法
[self.delegate makeMoney];
}
@end
Boy.h
#import <Foundation/Foundation.h>
#import "Girl.h"
// 4.引完头文件之后,boy需要签订协议
@interface Boy : NSObject<Marry>
@end
Boy.m
#import "Boy.h"
@implementation Boy
// 5.实现协议的方法makeMoney
- (void)makeMoney
{
NSLog(@"买买买买买");
}
main.m
#import <Foundation/Foundation.h>
#import "Boy.h"
#import "Girl.h"
int main(int argc, const char * argv[]) {
// 创建两个人,
Boy *adam = [[Boy alloc] init];
Girl *Eve = [[Girl alloc] init];
// 6.设置代理人
Eve.delegate = adam;
// 通过调用结婚的方法,来执行内部的协议
[Eve getMarry];
return 0;
}
版权声明:本文为博主原创文章,转载请注明原文地址
时间: 2024-10-13 20:39:00