灵活运用IOS类别(Category)和扩展(Extension)

先来说说类别的应用场景。既然已经有了继承,还要类别干嘛。类别是为已有类添加新方法,已有类可以是系统类或者自定义的类,类别的作用主要体现在为系统类添加新方法,这也是他的精髓。想想一个这样的场景,工程写到一半,需要为某个类添加新方法。如果你用继承的话,类名肯定要变了,所有你要用到新方法的地方,你都得一个一个的去改,一个工程上百个文件,想想都觉得蛋疼。这时候你只需要写个类别就ok了,什么都不用改。

创建类别前,先创建一个自定义类:People类,并实现方法eat

<pre name="code" class="objc">#import <Foundation/Foundation.h>
@interface People : NSObject
- (void)eat;
@end

 

@implementation People
- (void)eat{
    NSLog(@"people eat");
}
@end

应用一:不同功能就创建不同的类别。例如,创建一个learn功能的People类别并增加方法learnMath

cmd+n-->Objective-C File-->输入用途名(learn)和类本身名(People)。创建成功的文件名是:类本身+用途名(前面输入的那个)   例如 People+learn.h 和People+learn.m

#import "People.h"
@interface People (learn)
- (void)learnMath;
@end

#import "People+learn.h"
@implementation People (learn)
- (void)learnMath{
    NSLog(@"people learnMath");
}
@end
应用二:用类别为类添加新属性

好多文章说了类别不能添加属性,但是我试了下,是可以添加的,不过添加了@property(nonatomic,assign)float learnScore;之后.m里面会警告你learnScore属性的两个方法没有实现,类似于setter和getter。不过类别里面不能下划线调用属性做全局变量使用,就不能在这俩方法里面赋值和取值。所以,给类别添加属性好像没什么用途,不过,你可以在他的两个方法里面干点别的事情,^0^例如,我们新建了一个UIView的类别,并添加4个属性

#import <UIKit/UIKit.h>
@interface UIView (Category)

@property (nonatomic,assign) CGFloat x;//x坐标原点
@property (nonatomic,assign) CGFloat y;//y坐标原点
@property (nonatomic,assign) CGFloat w;//宽度
@property (nonatomic,assign) CGFloat h;//高度

@end
然后在.m里面实现一下
- (void) setX:(CGFloat)x{
    CGRect frame=self.frame;
    frame=CGRectMake(x, frame.origin.y, frame.size.width, frame.size.height);
    self.frame=frame;
}
- (CGFloat)x{
    return self.frame.origin.x;
}
他有什么用呢:(以打点的方式实现深度赋值和深度取值)

UIView *view=[[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
view.w=10;
NSLog(@"view的宽度%f",view.w);

再来说说拓展(Extension)
别人都叫他,是匿名的类别,不同于类别的 @interface UIView (Category),它的形式是@interface UIView (),圆括号里面是空的,并且只有.h没有.m文件
用得比较少,主要运用的是类别,所以博主没怎么研究





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值