Fork me on https://github.com

类的扩展(Extension , NSData, NSDateFormatter, Category, Extension, Protocol, delegate)

类的扩展

 

        OC数据类型 

        1.NSInteger, NSUInteger 

        2.CGFloat

        3.NSString, NSMutableString

        4.NSArray, NSMutableString 

        5.NSNumber 

        6.NSDictionary, NSMutableDictionary 

        7.NSSet, NSMutableSet      

        NSDate, 日期类, 继承于NSObject, 用于存储一个时间点  

        获取当前时间(0时区时间, 格林尼治时间)

        NSDate *date = [NSDate date];
        NSLog(@"%@", date);
        //NSTimeInterval = double
        NSDate *date1 = [NSDate dateWithTimeIntervalSinceNow:60];
        NSLog(@"%@", date1);
        
        //昨天的现在时刻
        NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:(-1 * (24 * 60 * 60))];
        NSLog(@"%@", yesterday);
        
        //明年的现在时刻
        NSDate *nextYear = [NSDate dateWithTimeIntervalSinceNow:366 * 24 * 60 * 60];
        NSLog(@"%@", nextYear);
        
        //昨天的现在时刻 与 明年的现在时刻 间隔多少秒
        NSTimeInterval interval = [yesterday timeIntervalSinceDate:nextYear];
        NSLog(@"%lf", interval);

时间戳: 某一时刻 1970.1.1 间隔的秒数

        //创建一个时间戳
        //把日期转化成时间戳
        NSTimeInterval timestamp = [date timeIntervalSince1970];
        NSLog(@"%lf", timestamp);
        
        //把时间戳转化成日期
        NSTimeInterval timestamp1 = 200;
        NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:timestamp1];
        NSLog(@"%@", date2);

 打印日期的格式: --::时区

        NSDateFormatter, 日期格式类, 继承于NSFormatter

        NSDate <-----NSDateFormatter------> NSString

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  

设置日期格式(2015108)

        YYYY/yyyy: 四位年份

        YY/yy: 两位年份

        MM: 两位月份, 不足两位补0

        M: 一位月份

        dd: 两位天期, 不足两位补0

        d: 一位天数

        DD/D: 这一天是这一年的第几天

        HH: 24小时制

        hh: 12小时制

        mm: 分钟

        ss:

        z: 时区

  [formatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss z"]; 

  设置时区

        NSTimeZone, 时区类, 继承于NSObject

        GMT: 格林尼治时间

        PST: 太平洋标准时间

        EST: 美国东部时间

NSTimeZone *timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
        [formatter setTimeZone:timeZone];

NSDate转化为NSString

        NSString *dateString = [formatter stringFromDate:date];
        NSLog(@"%@", dateString);

将字符串@“20140501 102318转换为NSDate对象

        NSString *string = @"2014年05月01日 10点23分18秒";
        [formatter setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
        [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
        NSDate *stringDate = [formatter dateFromString:string];
        NSLog(@"%@", stringDate);

  类的扩展(添加实例变量或方法)

        1.对已知类的扩展

        : 已知类, 能够看到源代码(.m文件)

        A.直接修改(能够添加实例变量和方法)

        B.Extension, 延展(可以添加实例变量和方法的声明)

        : 延展用于对已知类, 扩充类内部使用的实例变量和方法

        对声明的延续

1.
Person_Cosplay.h

#import
"Person.h" @interface Person () - (void)dance; @end
2.
Person.m
@interface
Person () { NSInteger _age; } - (void)dance; @end @implementation Person - (void)setName:(NSString *)name { _name = name; } - (NSString *)name { return _name; } - (void)eat { NSLog(@"吃个便饭"); [self dance]; } - (void)dance { NSLog(@"动次打次"); } @end

main.m

 [person eat]; 

  方法

        1.公开方法(方法声明写在.h), 在类的内部和外部使用

        2.私有方法(方法声明写在.m的延展中), 在类的内部使用

   2.对未知类的扩展

        : 未知类, 不能看到源代码(.m文件)

        A.继承(添加实例变量和方法)

        缺点: 扩展方法和实例变量, 只有子类才具备, 父类不能够使用

       B.Category, 范畴, 类目, 分类(只能添加方法, 内部不能添加实例变量)

NSString+play.h
#import
<Foundation/Foundation.h> @interface NSString (play) /* { CGFloat _price; } */ - (void)playBasketball; @end
NSString+play.m
#import "NSString+play.h"
@implementation NSString (play)
- (void)playBasketball {
    NSLog(@"怒扣敬明");
}
@end
    main.m
        NSString *string2 = [[NSString alloc] init];
        [string2 playBasketball];

   Protocol, 协议(只定义了方法的声明)

        只有遵守了协议. 协议才生效, 遵守协议的类必须完成方法的实现

        协议具有普遍使用性, 不是针对某一个类

Love.h//协议
#import <Foundation/Foundation.h>
@protocol Love <NSObject>
@required//必须遵守的(默认值)
- (void)buyFood;
- (void)sendWater;
@optional//可选的
- (void)buyiPhone;
@end
Student.h
#import <Foundation/Foundation.h>
//一个类如何遵守协议
//1.引入协议
#import "Love.h"
//2.遵守协议
@interface Student : NSObject <Love>
@end
Student.m
#import "Student.h"
@implementation Student
- (void)buyFood {
    NSLog(@"早起, 排队, 买热包子, 小跑送到楼下");
}
- (void)sendWater {
    NSLog(@"大热天, 排队接水, 送到楼下");
}
- (void)buyiPhone {
    NSLog(@"省吃俭用, 中午不吃饭, 晚上辣椒蘸酱油, 坚持了一年, 终于攒够了公交费到那里, 卖了个肾, 买了个iPhone送给TA, Ta说分手吧");
}
@end
main.m
        Student *stu = [[Student alloc] init];
        [stu buyFood];
        [stu sendWater];
        [stu buyiPhone];

代理模式(委托模式, Delegate), 是一种设计模式

Woman.h
#import <Foundation/Foundation.h>
#import "Nurse.h"
@interface Woman : NSObject {
    //delegate实例变量
    //1.因为不确定最终找到的保姆是什么类型, 类型用id
    //2.并不是所有人都可以当保姆, 必须遵守协议
    //注: id<Nurse>, 基于类型的限定 
    id<Nurse> _delegate;
}
- (void)setDelegate:(id<Nurse>)delegate;
- (id<Nurse>)delegate;
- (void)work;
- (void)cook;
- (void)takeCareOfBaby;
@end
Woman.m
#import "Woman.h"
@implementation Woman
- (void)setDelegate:(id<Nurse>)delegate {
    _delegate = delegate;
}
- (id<Nurse>)delegate {
    return _delegate;
}
- (void)work {
    NSLog(@"辛苦工作");
}
- (void)cook {
//     NSLog(@"精心做饭");
    //判断代理有没有做饭的能力(判断delegate是否相应canCook这个方法)
    if ([_delegate respondsToSelector:@selector(canCook)]) {
         [_delegate canCook];
    }
   
}
- (void)takeCareOfBaby {
//     NSLog(@"耐心照看孩子");
    if ([_delegate respondsToSelector:@selector(canTakeCareOfBaby)]) {
        [_delegate canTakeCareOfBaby];
    }
    
}
@end
Nurse.h//协议
#import <Foundation/Foundation.h>
@protocol Nurse <NSObject>
- (void)canCook;
- (void)canTakeCareOfBaby;
@end
Chef.h
#import <Foundation/Foundation.h>
#import "Nurse.h"
@interface Chef : NSObject<Nurse>
@end
Chef.m
#import "Chef.h"
@implementation Chef
- (void)canCook {
    NSLog(@"做了蚂蚁上树, 锅包肉, 小鸡炖蘑菇, 铁锅炖大鹅");
}
- (void)canTakeCareOfBaby {
    NSLog(@"厨师教孩子刀法");
}
@end
main.m
Woman *woman = [[Woman alloc] init];
        [woman work];
        [woman cook];
        [woman takeCareOfBaby];        
        Chef *chef = [[Chef alloc] init];      
        //妇女设定代理是厨师
        [woman setDelegate:chef];    
        //妇女想要做饭
        [woman cook];
        [woman takeCareOfBaby];
从妇女角度出发, 找保姆

        1.制定一个保姆的标准(协议)

        2.找到保姆后, 和保姆建立关系(写一个delegate实例变量, 写上对应的settergetter)

        3.让代理去做某件事(安全做法: 判断代理能否执行某个方法)

从保姆的角度出发, 找工作

        1.满足雇主的要求(遵守协议)

        2.与雇主建立关系

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2015-10-10 10:08  OrangesChen  阅读(370)  评论(0编辑  收藏  举报