类的扩展(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.与雇主建立关系

 

 

 

时间: 2024-10-05 04:44:56

类的扩展(Extension , NSData, NSDateFormatter, Category, Extension, Protocol, delegate)的相关文章

Objective-C学习笔记_类的扩展

一Category的定义和使用 二Extension的定义和使用 三Protocol的定义和使用 delegate的使用 一.Category的定义和使用 Category,分类或类目.主要作用是为没有源代码的类添加方法.通过Category添加的方法会成为原类的一部分.从而达到扩展一个类的功能. 定义Category过程 新建?件 选择Objective-C Category模板 填写类名和分类名 .h?件添加?法声明 .m添加?法实现 Category的声明 NSString+SayHi.h

OC学习-类的扩展

类目-Category 作用:主要为没有源代码的类添加方法(比如系统的类) 定义Category 新建文件 选择OC Category模板 填写类和分类名 在.h中添加方法声明 在.m中添加方法实现 声明Category NSString+StringMethod.h @interface NSString (StringMethod) - (void)sayHi; @end NSString+StringMethod.m @implementation NSString (StringMeth

Objective-C_类的扩展

一Category的定义和使用 二Extension的定义和使用 三Protocol的定义和使用 delegate的使用 一.Category的定义和使用 Category,分类或类目.主要作用是为没有源码的类加入方法.通过Category加入的方法会成为原类的一部分. 从而达到扩展一个类的功能. 定义Category过程 新建?件 选择Objective-C Category模板 填写类名和分类名 .h?件加入?法声明 .m加入?法实现 Category的声明 NSString+SayHi.h

基本语法 protocols Category extension

转:http://blog.csdn.net/wangeen/article/details/16989529 protocol   本质就是一系列的method的声明,他并不像class是必须的选项,根据自己的设计模式来选择性的使用. protocol协议时为了补充Objective-C 只能单继承的缺陷而增加的一个新功能.Objective-C重所有的方法都是虚方法,所以在oc重也就没有关键字 virtual一说,有了协议可以补充 Objective-C单继承的缺陷,协议并不是一个真正的类,

class extension、class category、class-continuation category

class extension Objective-C 2.0增加了class extensions用于解决两个问题: 允许一个对象可以拥有一个私有的interface,且可由编译器验证. 支持一个公有只读,私有可写的属性. extension更像是匿名的category class category category更倾向于写在独立的文件中,之后这样命名“NSView+CustomAdditions.h”,在对应的.m文件中的block块中实现.所以,cagegory更倾向于用于对class进

OC 07 类的扩展

1.NSDate的使用 NSDate是Cocoa中?于处理?期和时间的基础类,封装了某?给定的时刻(含日期,时间,时区) 注意NSLog(@“%@”,nowDate);?论你是哪个时区的时间,打印时总是打印对应的0时区时间. 2.NSTimelnterval NSTimelnterval(即double类型) 常用方法: 可以使用-initWithTimeIntervalSinceNow:方法传?一个NSTimeInterval参数,创建一个 NSDate对象   1 // NSDate: 处理

Swift中的结构体,类,协议,扩展和闭包的用法以及? 和 !的区别

// MARK: - 1.结构体 //1.声明一个结构体 struct Rect {    // 声明结构体变量的属性(存储属性)    var x:Float    var y:Float    var width:Float    var height:Float    // 声明结构体属性,要使用static    static var description:String?        // 声明一个计算属性(是用来专门计算结构体变量属性的setter,和getter方法,其本身没有存

ios开发类的扩展

类扩展常见方法:定义子类.遵循协议.使用分类.源文件拓展. 源文件拓展:语法:在声明@implementation前添加 @interface 类名() .... @end 分类Category 向现有类中添加方法时添加子类不方便 分类是对现有类的扩展,分类只扩展方法,不扩展属性 协议Protoccol 可以用来声明一大堆方法 只要某个类遵循了这个协议,就相当于拥有了这个协议中的所有方法声明

iOS OC07.2_类的扩展

类目 //1.系统已经写好的类目:按照功能对系统的类方法进行区分 //[email protected]开始,后面是当前类的名字,类名后面是分类的功能,到@end结束 //2.我们创建的类目,一般是为了把系统的类进行功能扩充 // NSString *[email protected]"2015-07-12 10:00:00"; // NSString *[email protected]"2015-07-12 09:00:00"; //// [str sayHi]