分类与扩展区别 Obj-C、Swift

Obj-C 扩展

  • 在OC中经常会使用扩展,如下在.m文件中。

1. @interface 类名后面加()

2. 扩展中自动生成实现【get、set方法 以及 声明一个成员变量,成员变量命名会在属性名的前面加一个_】

3. oc中定义私有属性的方式。【那私有方法呢?😂直接写实现呀,还要定义干嘛?】

#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UIView *view1;

@end

@implementation ViewController

- (void)viewDidLoad {
    _view1 = [[UIView alloc]init];
    [self.view addSubview:_view1];
}

@end

<?php 
echo "Hello World!"; 
?> 

Obj-C 中的分类

  • 我这里新建了一个Person对象。里面什么都没有然后写了个Person的分类Person(addition)
  • 分类中只能定义方法
  • ()必须有名称

.h文件

#import "Person.h"

@interface Person(addition)
@property (nonatomic, assign) int year;
@end

.m文件

#import "Person+addition.h"

@implementation Person(addition)

@end

ViewController中创建对象并且进行打印。

#import "ViewController.h"
#import "Person+addition.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Person *p1 = [[Person alloc]init];
    p1.year = 11;
    NSLog(@"%d",p1.year);
}

这个异常信息,它通常是消息接收者找不到对应的@selector()方法。意思是get set方法都没有。

image
image

其实Xcode已经提示了。没有定义set 和get 方法【其实连申明都没有因为_year找不到~~】。我感觉这里报错会比较合适。😂

image

但是呢。😂 使用@synthesize year手动创建 set year ivar呢?会报错。【所以想要扩展属性还是乖乖的用runtime吧】

image

可以写@property (nonatomic, assign) int year;但是没有定义属性,只能写set 和get方法那如何应用呢😂

如何使用。

  • Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, assign) int year;
@end
  • Person.m文件文件没有内容
  • Person+addition.h文件
#import "Person.h"

@interface Person(addition)
@property (nonatomic, assign) int theYear;

-(int)theYear;
-(void)setTheYear:(int)theYear;

@end
  • Person+addition.m文件
#import "Person+addition.h"

@implementation Person(addition)

-(int)theYear{
    return self.year + 1;
}
-(void)setTheYear:(int)theYear{
    self.year = theYear;
}

@end

其实就是用 set get 方法进行一些操作。比如对里面属性赋值呀。运算等。

  • ViewController.m 中使用
#import "ViewController.h"
#import "Person+addition.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Person *p1 = [[Person alloc]init];
    p1.theYear = 1;
    NSLog(@"myYear:%d",p1.year);
    NSLog(@"year:%d",p1.theYear);
}


@end

打印结果


image

Swift

  • Swift中是没有分类的。只有扩展哦。
  • 和OC中的分类又点类似,不能定义属性,用起来像是属性但是呢 其实就是get 和set方法。但是本身不是属性。
  • 可以在扩展中定义方法。
  • 呢么看Swift中的扩展简直就是简单粗暴。
import UIKit

class Person: NSObject {
    var myYear:Int = 0;
}


extension Person{
    var year:Int{
        get{
            return myYear;
        }
        set{
            
            myYear = 22
        }
    }
    
    func log() {
        print("打印下")
    }
}

Person的使用

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let p1 = Person()
        print(p1.year);
    }

}

Swift中的扩展用法和OC的分类类似。而OC的扩展基本就是用于创建私有属性。 由于Swift中私有属性都是 private来申明的所以就没了?


最后 OC中的分类中的结构体有几个属性?

这里不写代码了,其实在我们经常使用的代码里就有了。说一个现象可能就想到了,那就是不能对frame的中的属性直接复制,这是为啥呢?

看下面截图。

  • 原来frame是在分类中,呢么按照刚说的,先不管结构体。呢么肯定了我们使用的是get 和set 方法,而不是属性。
  • 而CGRect是一个结构体。
  • 所以我们只能进行set方法了。就有了我们平时的写法 self.view.frame = CGRectMake(0, 0, 0, 0);所以呀结构体里是没有属性的,我们只是把结构体当做参数拿来对UIView中的一些属性进行了操作。
    image
image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 503 7672 好喝不贵,适口为珍。
    灵静自远阅读 173评论 0 0
  • 我连做梦也感觉受伤 一年过了 还是一天 计算着慌张 计程车上的音响 我们最爱的情歌 这一刻却重重击破思念的 心脏 ...
    MrairC阅读 216评论 0 0
  • 今天早上她推开门,满目刺眼的白让她吃了一惊,雪很厚,踩上去发出咯吱咯吱的声音,堪与老家的大雪相当。 不远处,花坛划...
    指尖上的独角兽阅读 573评论 0 1
  • 《一出好戏》上映了,这部黄渤执导的电影,前期宣传到位,各大综艺,以及黄渤等人自带人品,这部电影未播已经先火...
    SL_28f6阅读 189评论 2 2