码迷,mamicode.com
首页 > 其他好文 > 详细

OC学习-类的扩展

时间:2015-07-24 20:50:19      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:oc   category   extension   protocol   

类目-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;      
}

版权声明:本文为博主原创文章,转载请注明原文地址

OC学习-类的扩展

标签:oc   category   extension   protocol   

原文地址:http://blog.csdn.net/u011752406/article/details/47045887

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!