最近了解了下OC的鏈式語法蛀醉,跟我們平時[obj xxx]
這種方法調(diào)用格式大相徑庭。于是乎布蔗,自己也嘗試著實現(xiàn)了如下調(diào)用方式:
UIView *view = [UIView new];
view.x.y.equalTo(5).with.w.h.equalTo(50);
NSLog(@"%@", NSStringFromCGRect(view.frame));
輸出:{{5, 5}, {50, 50}}
完整Demo在這里:https://github.com/xiaoxm/ObjCChainingTest
這里簡單記錄下每種寫法的實現(xiàn)機制:
view.x
回憶下藤违,通常我們可以這樣寫一般是因為有一個property,而property會自動獲得getter纵揍、setter方法顿乒。看代碼:
//聲明property x
@property (nonatomic, assign) CGFloat x;
//于是自動獲得如下方法泽谨,?且不需要自己手動再寫一遍
- (void)setX:(CGFloat)x;
- (CGFloat)x;
而view.x
會解析為調(diào)用方法- (CGFloat)x;
璧榄。同理,如果想要支持view.x
這種調(diào)用方式吧雹,只需要添加方法- (CGFloat)x;
即可骨杂。
view.x.y
將- (CGFloat)x;
?修改為- (UIView *)x;
。這樣雄卷,view.x
執(zhí)行后返回值仍舊為view對象腊脱,點語法繼續(xù)調(diào)用,等同于view.x
龙亲、view.y
這兩步陕凹。
view.equalTo(5)
首先我們來看下block的基本使用:
//例1
void (^block)() = ^(){
NSLog(@"無參數(shù),無返回值");
};
block();
//例2
void (^block)(int) = ^(int val){
NSLog(@"僅參數(shù):%d", val);
};
block(5);
//例3
int (^block)() = ^(){
return 5;
};
NSLog(@"僅返回值:%d", block());
//例4
int (^block)(int) = ^(int val){
return val + 1;
};
NSLog(@"有參數(shù)鳄炉,有返回值:%d", block(5));
我們觀察block的調(diào)用方式:block();
是不是有些啟發(fā)了呢杜耙?
view.equalTo()
可以這么理解:view.equalTo
獲取到一個block
,然后末尾加上()
便是調(diào)用這個block了拂盯。
于是乎佑女,定義一個返回值為block的方法- (void (^)())equalTo;
便可以這樣調(diào)用view.equalTo();
這里還需要一個輸入?yún)?shù),簡單谈竿,修改block就好:- (void (^)(CGFloat))equalTo;
团驱。于是最終調(diào)用便有了:view.equalTo(5)
以上,祝大家玩得開心~