黑魔法 iOS鏈式程式設計

2021-08-19 19:16:40 字數 3432 閱讀 7274

在使用sdautolayout 時就已經發現這種鏈式程式設計。通過」.」 將屬性鏈結在一起形成如同一條鏈的程式設計方法。

self.totalmoneycount

.sd_layout.leftequaltoview(self).rightequaltoview(self).topspacetoview(self.totalmoney, autoheight(15)).autoheightratio(0);

核心實現原理:只要返回是本身這個物件

下列是普通方法的實現,稍候會對兩個方法進行改變,形成乙個普通的鏈式。

//person 類 兩個類中均無返回

-(void)goshopping

-(void)runing

person *person = [[person alloc]init];

[person goshopping];

[person runing];

//person 類 兩個類中均無返回

-(person *)goshopping

-(person *)runing

person *person = [[person alloc]init];

[[[person goshopping]runing]goshopping];

基本鏈式,你已經很明白了,但這種方式不美觀,如果帶引數,你會發現更不美觀了,並且如果方法體中引數過長,串起來很難看。

如果你不太懂block,那麼我建議你先檢視ios之block

-(person* (^)

(void))goshopping;

return block;

}-(person* (^)

(void))runing;

return block;

}person *person = [[person alloc]init];

person.goshopping().runing().goshopping().runing();

到這裡,你能很直**見,block形式的鏈式比起普通方法的鏈式形式更美觀。

其實很多人都有疑惑,(person* (^)(void)) runing(^)(void)person *這啥意思?其實你可能和我一樣,拆開看了,person* (^)(void)是乙個以block定義的整體,我第一次看有點懵,後來才看明白。現在我用typedef定義一下。

#import 

@inte***ce

person : nsobject

//注意,typedef block形式要在inte***ce之上才能被自動聯想,然後移到inte***ce之下,不然會已找不到person而報錯

typedef person *(^personblock)(void);

@property(nonatomic,copy)personblock personblock;

-(personblock)goshopping;

-(personblock)runing;

@end

#import "person.h"

@implementation

person

-(personblock)goshopping;

}-(personblock)runing;

}@end

block裡處理業務,最後return self 是為了返回本身,繼續支援鏈式。

你已經掌握了鏈式的結構,上面的鏈式足夠你使用了,但你在實際使用時,發現block沒有提示帶值。完全需要手動,能明顯感覺有缺陷。這時候就需要新增幾個block做成屬性來替代普通方法。

我將刪除無關的**,包括上面提到過的,實現乙個加法運算。

#import 

@inte***ce

person : nsobject

typedef person* (^add)(cgfloat value);

// 加法,關於readonly:在呼叫時,防止出現self.addvalue = ^person *(cgfloat value) {};

@property(nonatomic,copy,readonly)add addvalue;

//計數和

@property(nonatomic,assign)cgfloat sum;

//運算

-(void)runit;

@end

#import "person.h"

@inte***ce

person()

@property(nonatomic,copy)add addvalue;

@end

@implementation

person

-(add)addvalue;

}return _addvalue;

}-(void)runit

@end

因為我用的是person類進行的加法運算,所以看起來有出處,很奇怪

#import 

#import "person.h"

@inte***ce

nsobject (calculator)

+(cgfloat)calculate:(void(^)(person* person)) cal;

@end

@implementation

nsobject (calculator)

+(cgfloat)calculate:(void(^)(person* person)) cal

@end

使用

cgfloat value = [nsobject calculate:^(person *person) ];

nslog(@"->>>>%lf",value);

可以看出,鏈式程式設計像是「組合」的一種,不在乎呼叫的先後順序(這句話可能不太準確,如果使用鏈式進行sql語句拼接,還是需要順序),對於需要額外增加的,只需要新增乙個屬性。

並且呼叫方法可以一直呼叫同乙個方法,比如:person.goshopping().goshopping().goshopping無限制。

所以總結:適合動態,可接收不在乎呼叫先後順序,次數等動態需求。

至此,你已經掌握了鏈式程式設計了。

深入淺出-ios函式式程式設計的實現 && 響應式程式設計概念

幾種程式設計思想在ios中的實現:(一)鏈式程式設計

鏈式程式設計與函式式程式設計

黑魔法 iOS函式式程式設計

所謂的函式式程式設計就是當物件呼叫完乙個函式之後,返回的還是這個物件本身,緊接著又可以繼續呼叫此函式或者物件中定義的其他函式。其實讀到這裡,我已經覺得函式式程式設計和鏈式程式設計很像。鏈式程式設計也可以呼叫乙個函式後,返回本身,然後呼叫其他函式。但還是有出處的。鏈式程式設計的返回需要繼續進鏈式,就返...

巨集定義黑魔法

1 define clr red 033 31m 紅色字 define clr green 033 32m 綠色字 define clr yellow 033 33m 黃色字 define clr blue 033 34m 藍色字 define clr purple 033 35m 紫色字 defi...

iOS鏈式程式設計

nsinteger result adder.add 4 sub 1 mult 2 div 3 表示 4 1 2 3,是不是很方便很直觀。我們知道,如果是c 的實現話鏈式操作是很簡單的,因為c 的函式呼叫就是通過點操作呼叫的,只需要返回物件本身就可以實現鏈結了。但是oc就不行了,因為oc的點操作表示...