Obj-C 擴(kuò)展
- 在OC中經(jīng)常會(huì)使用擴(kuò)展,如下在
.m
文件中茫负。
1. @interface 類名后面加()
2. 擴(kuò)展中自動(dòng)生成實(shí)現(xiàn)【get蕉鸳、set方法 以及 聲明一個(gè)成員變量,成員變量命名會(huì)在屬性名的前面加一個(gè)_】
3. oc中定義私有屬性的方式∪谭ǎ【那私有方法呢潮尝???直接寫(xiě)實(shí)現(xiàn)呀,還要定義干嘛饿序?】
#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 中的分類
- 我這里新建了一個(gè)Person對(duì)象勉失。里面什么都沒(méi)有然后寫(xiě)了個(gè)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中創(chuàng)建對(duì)象并且進(jìn)行打印。
#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);
}
這個(gè)異常信息,它通常是消息接收者找不到對(duì)應(yīng)的@selector()方法原探。意思是get set方法都沒(méi)有乱凿。
其實(shí)Xcode已經(jīng)提示了顽素。沒(méi)有定義set 和get 方法【其實(shí)連申明都沒(méi)有因?yàn)開(kāi)year找不到~~】。我感覺(jué)這里報(bào)錯(cuò)會(huì)比較合適徒蟆。??
但是呢胁出。?? 使用
@synthesize year
手動(dòng)創(chuàng)建 set year ivar呢?會(huì)報(bào)錯(cuò)段审∪【所以想要擴(kuò)展屬性還是乖乖的用runtime吧】
可以寫(xiě)@property (nonatomic, assign) int year;但是沒(méi)有定義屬性,只能寫(xiě)set 和get方法那如何應(yīng)用呢??
如何使用寺枉。
- Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, assign) int year;
@end
- Person.m文件文件沒(méi)有內(nèi)容
- 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
其實(shí)就是用 set get 方法進(jìn)行一些操作抑淫。比如對(duì)里面屬性賦值呀。運(yùn)算等姥闪。
- 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
打印結(jié)果
Swift
- Swift中是沒(méi)有分類的丈冬。只有擴(kuò)展哦。
- 和OC中的分類又點(diǎn)類似甘畅,不能定義屬性,用起來(lái)像是屬性但是呢 其實(shí)就是get 和set方法往弓。但是本身不是屬性疏唾。
- 可以在擴(kuò)展中定義方法。
- 呢么看Swift中的擴(kuò)展簡(jiǎn)直就是簡(jiǎn)單粗暴函似。
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中的擴(kuò)展用法和OC的分類類似槐脏。而OC的擴(kuò)展基本就是用于創(chuàng)建私有屬性。 由于Swift中私有屬性都是 private來(lái)申明的所以就沒(méi)了撇寞?
最后 OC中的分類中的結(jié)構(gòu)體有幾個(gè)屬性顿天?
這里不寫(xiě)代碼了,其實(shí)在我們經(jīng)常使用的代碼里就有了蔑担。說(shuō)一個(gè)現(xiàn)象可能就想到了牌废,那就是不能對(duì)frame的中的屬性直接復(fù)制,這是為啥呢啤握?
看下面截圖鸟缕。
- 原來(lái)frame是在分類中,呢么按照剛說(shuō)的排抬,先不管結(jié)構(gòu)體懂从。呢么肯定了我們使用的是get 和set 方法,而不是屬性蹲蒲。
- 而CGRect是一個(gè)結(jié)構(gòu)體番甩。
- 所以我們只能進(jìn)行set方法了。就有了我們平時(shí)的寫(xiě)法
self.view.frame = CGRectMake(0, 0, 0, 0);
所以呀結(jié)構(gòu)體里是沒(méi)有屬性的届搁,我們只是把結(jié)構(gòu)體當(dāng)做參數(shù)拿來(lái)對(duì)UIView中的一些屬性進(jìn)行了操作缘薛。