OC学习-类的扩展

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

OC学习-类的扩展的相关文章

OC 07 类的扩展

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

OC --(7)-- 类的扩展

一.NSDate和NSDateFormatter 在iOS开发中,NSDate的使用场景很多,比如:聊天程序里:几分钟前,昨天,几天前的计算;网络请求中的时间戳(计算当前时间距 离1970年1月1日的秒数) 二 .NSDate的使用 三.NSTimeinterval

JavaScript学习总结(十四)——JavaScript编写类的扩展方法

在?J?a?v?a?S?c?r?i?p?t?中?可以使?用?类的p?r?o?t?o?t?y?p?e属性来?扩?展?类的属?性?和?方?法,在实际开发当中,当JavaScript内置的那些类所提供的动态方法和动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中的方法和属性. 一.扩展JavaScript内置类,添加动态方法 语法格式: 类名.prototype.方法名 = function([param1],[param2],.

OC学习总结之面向对象和类

OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程  面向对象和面向过程是编程的两种思考方式.面向对象,简称OOP,它是以事物为中心,参与事件的事物是核心,完成事件只是事物的一个小任务.面向过程,简称OPP,它是以事件为中心,事件是核心,列出了完成事件的每一个步骤,一步一步完成.也就是面向对象侧重于从问题在寻找客体.客体的作用.客体间的关系即“谁”.“做什么”.“怎么做”,面向过程侧重于问题的分解即“事

Java程序员的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

计划按如下顺序完成这篇笔记: 1.    理念. 2.    属性复制和继承. 3.    this/call/apply. 4.    闭包/getter/setter. 5.    prototype. 6.    面向对象模拟. 7.    jQuery基本机制. 8.    jQuery选择器. 9.    jQuery工具方法. 10.    jQuery-在"类"层面扩展. 11.    jQuery-在"对象"层面扩展. 12.    jQuery-扩

OC学习 -- Category(类目)

category 类目,分类  为没有源代码的类添加方法   一旦添加成功就相当于原来类具有该方法category  包括两个部分1: @interface + 类名(为哪一个类添加分类) + (分类名) + @end 进行方法的声明2: @implementation + 类名(为哪一个类添加分类) + (分类名) + @end  进行方法的实现 什么是Category Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的,在很多情形下Category也是比创建子类更优的选择

学习笔记之05-第一个OC的类

一.语法简介 1.类 在Java中,我们用1个.java文件就可以描述清楚一个类:在OC中,一般用2个文件来描述一个类: 1> .h:类的声明文件,用于声明成员变量.方法.类的声明使用关键字@interface和@end. 注意:.h中的方法只是做一个声明,并不对方法进行实现.也就是说,只是说明一下方法名.方法的返回值类型.方法接收的参数类型而已,并不会编写方法内部的代码. 2> .m:类的实现文件,用于实现.h中声明的方法.类的实现使用关键字@implementation和@end. 2.方

OC学习6——面相对象的三大特性

我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问(该隐藏的隐藏,该暴露的暴露).封装的主要目的是: 隐藏类的实现细节 让使用者只能通过预先定义好的方法来访问数据,从而可以在该方法中加入控制逻辑,限制对成员变量的不合理访问 可进行数据检查,从而有

OC学习15——文件I/O体系

OC提供了丰富的I/O相关API,如果只是管理文件和目录,程序可以使用NSFileManager进行管理,包括创建.删除.移动和复制文件等:如果程序需要读取文件内容,则可通过NSFileHandle进行处理:如果需要读取网络资源,则可通过NSURL进行处理:如果程序只是读取项目内部资源,则可借助MSBundle进行处理. 1.Foundation提供了NSData和NSMutableData,他们代表OC的数据缓冲区.NSData的作用有两个:将数据读入NSData:输出NSData的数据. 1