zoukankan      html  css  js  c++  java
  • 类的扩展(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.与雇主建立关系

     

     

     

     

     

    The one who wants to wear a crown must bear the weight!
  • 相关阅读:
    CVS 快速入门指南
    我的博客皮肤
    OOP三个基本特征
    vi 操作
    智者能堪破这世界的定数,但没人能逃脱劫数
    技术路径的四阶段
    python每日学习2018/1/14(python之禅)
    python每日学习2018/1/11
    Python PyInstaller安装和使用教程(详解版)
    Windows环境下安装MinGW/gcc
  • 原文地址:https://www.cnblogs.com/OrangesChen/p/4862536.html
Copyright © 2011-2022 走看看