一螟蒸,什么是鏈式調(diào)用盒使?
在網(wǎng)絡前端編程里使用JQuery,經(jīng)称呦樱可以看到鏈式調(diào)用少办,代碼易讀簡潔。
例如:
$(“#Test”).css(‘color’,’red’).show(200).removeClass(‘style’);?對id選擇器為Test的對象進行了三項操作:先設置其字體顏色為紅色抄瑟,再顯示對象凡泣,最后移除對象的“style”樣式枉疼。
通過“.”操作符調(diào)用方法執(zhí)行后返回方法執(zhí)行的實體,然后可以接著再使用“.”操作符繼續(xù)調(diào)用其它方法鞋拟。
二骂维,Objective-C里面如何實現(xiàn)鏈式操作?
非常簡單贺纲,Objective-C語言里面航闺,跟JQuery里面一樣,可以使用Block實現(xiàn)鏈式調(diào)用猴誊。
摘抄一個網(wǎng)絡上提供的實現(xiàn)例子說明:
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調(diào)用返回調(diào)用者本身。
// Person覆寫的方法?- ( Person *(^)() )eat{???? return ^{??????? NSLog(@"吃飯");???????? return self;???? };?}?- ( Person *(^)() )learn{???? return ^{??????? NSLog(@"學習");??????? return self;??? };?}?- ( Person *(^)() )play?{?????return ^{???????? NSLog(@"娛樂");???????? return self;???? };?}?// 帶參數(shù)的鏈式調(diào)用- ( Person *(^)(?NSString* food?) )eat?{??? return ^(?NSString* food?){???????? NSLog(@"吃飯---- %@",food);??????? return self;??? };}
鏈式調(diào)用實例:
Person *p = [ [Person alloc] init ];
無參數(shù)情況:
p.eat().learn().play();
輸出:
吃飯
學習
娛樂
有參數(shù)情況:
p.eat(@”意大利面”).learn().play();
輸出:
吃飯—-意大利面
學習
娛樂
三墨状,有實戰(zhàn)意義嗎卫漫?如何使用?
哇哇肾砂,看起來是個不錯的小竅門啊列赎,但是有實戰(zhàn)意義嗎?能引入什么方便嗎镐确?
好吧包吝,之前寫過兩個SpriteKit的教程,做相關(guān)游戲源葫,里面都有提到動畫相關(guān)的東東漏策。如果我要指揮一個SpriteNode實體,必須指定相關(guān)的SKAction然后讓該SpriteNode節(jié)點臼氨,執(zhí)行SKAction掺喻。如果是一個動作還好,但是如果要執(zhí)行一系列動作储矩,或者同時運行很多動作的話感耙,就要生成很多SKAction,然后把它們組合在一起成為一個sequence或者group的action一起執(zhí)行持隧。
具體來舉例即硼,向右移動100,向上移動100屡拨,向左移動50只酥,向上移動100的動畫褥实,需要如下實現(xiàn):
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的類,可以實現(xiàn)SKAction的鏈式調(diào)用裂允,Github工程地址為
https://github.com/halinuya/WJSAction.git
损离,完成上面的調(diào)用,僅用如下一行就可以實現(xiàn)绝编。
[SpriteNode runAction:[WJSACTION.SeqStart().moveByV(CGVX(100),1).moveByV(CGVY(100),1).moveByV(CGVX(-50),1).moveByV(CGVY(100),1).SeqEnd()]];
看起來比較簡單簡潔僻澎,不需要很多中間變量。
大家可以到我封裝的
工程里面直接使用鏈式SKAction十饥,簡化代碼窟勃。