一,什麼是鏈式調用?
在網絡前端編程裡使用JQuery,經常可以看到鏈式調用,代碼易讀簡潔。
例如:$(“#Test”).css(‘color’,’red’).show(200).removeClass(‘style’); 對id選擇器為Test的對象進行了三項操作:先設置其字體顏色為紅色,再顯示對象,最後移除對象的“style”樣式。
通過“.”操作符調用方法執行後返回方法執行的實體,然後可以接著再使用“.”操作符繼續調用其它方法。
二,Objective-C裡面如何實現鏈式操作?
非常簡單,Objective-C語言裡面,跟JQuery裡面一樣,可以使用Block實現鏈式調用。
摘抄一個網絡上提供的實現例子說明:
1,首先定義一個Person對象,然後定義名為eat、learn、play的幾個塊為成員變量,聲明為property屬性
@property (nonatomic, readonly) (Person*(^)())eat; @property (nonatomic, readonly) (Person*(^)())learn; @property (nonatomic, readonly) (Person*(^)())play;
2,property屬性會默認生成setter和getter方法,我們這裡覆寫getter方法,傳出一個Block,Block調用返回調用者本身。
// Person覆寫的方法 - ( Person *(^)() )eat { return ^{ NSLog(@"吃飯"); return self; }; } - ( Person *(^)() )learn { return ^{ NSLog(@"學習"); return self; }; } - ( Person *(^)() )play { return ^{ NSLog(@"娛樂"); return self; }; } // 帶參數的鏈式調用 - ( Person *(^)( NSString* food ) )eat { return ^( NSString* food ){ NSLog(@"吃飯---- %@",food); return self; }; }
鏈式調用實例:
Person *p = [ [Person alloc] init ];
無參數情況:
p.eat().learn().play();
輸出:
吃飯
學習
娛樂
有參數情況:
p.eat(@”意大利面”).learn().play();
輸出:
吃飯—-意大利面
學習
娛樂
三,有實戰意義嗎?如何使用?
哇哇,看起來是個不錯的小竅門啊,但是有實戰意義嗎?能引入什麼方便嗎?
好吧,之前寫過兩個SpriteKit的教程,做相關游戲,裡面都有提到動畫相關的東東。如果我要指揮一個SpriteNode實體,必須指定相關的SKAction然後讓該SpriteNode節點,執行SKAction。如果是一個動作還好,但是如果要執行一系列動作,或者同時運行很多動作的話,就要生成很多SKAction,然後把它們組合在一起成為一個sequence或者group的action一起執行。
具體來舉例,向右移動100,向上移動100,向左移動50,向上移動100的動畫,需要如下實現:
SKAction *move = [SKAction moveBy:CGVectorMake(100, 0) duration:1]; SKAction *move2 =[SKAction moveBy:CGVectorMake(0, 100) duration:1]; SKAction *move3 = [SKAction moveBy:CGVectorMake(-50, 0) duration:1]; SKAction *move4 = [SKAction moveBy:CGVectorMake(0, 100) duration:1]; SKAction *seq = [SKAction sequence:@[move,move2,move3,move4]]; [SpriteNode runAction:seq];
我自己封裝了一個WJSAction的類,可以實現SKAction的鏈式調用,Github工程地址為https://github.com/halinuya/WJSAction.git,完成上面的調用,僅用如下一行就可以實現。
[SpriteNode runAction:[WJSACTION.SeqStart().moveByV(CGVX(100),1).moveByV(CGVY(100),1).moveByV(CGVX(-50),1).moveByV(CGVY(100),1).SeqEnd()]];
看起來比較簡單簡潔,不需要很多中間變量。
大家可以到我封裝的WJSAction工程裡面直接使用鏈式SKAction,簡化代碼。