Objective C中實現鏈式語法 解釋

2021-07-24 20:20:01 字數 3478 閱讀 3322

在接觸到開源專案 masonry 後,裡面的布局約束的鏈式寫法讓我頗感興趣,就像下面這樣:

1

2

3

4

5

6

7

8

uiedgeinsets padding = uiedgeinsetsmake(10, 10, 10, 10);

[view1 mas_makeconstraints:^(masconstraintmaker *make) ];

其他語言比如 lua, 實現鏈式語法很容易。但在 objective-c 中,如何實現鏈式語法呢?

注:這裡討論的鏈式語法特指的是點鏈式語法,不同於中括號鏈式語法,如[[[[someobj method1] method2] method3] method4:someparam]。中括號鏈式語法相對而言更簡單些,每個方法的返回值是下乙個方法的傳送者即可。

檢視 masonry 原始碼,起初沒看明白,於是搜尋了下 stackoverflow,沒有發現類似的問題,便將這個問題發布在了 stackoverflow 上。這裡是位址。

總結了下,貼下**,做個說明。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

@class classb;

@inte***ce classa : nsobject

// 1. 定義一些 block 屬性

@property(nonatomic, readonly) classa *(^aaa)(bool enable);

@property(nonatomic, readonly) classa *(^bbb)(nsstring* str);

@property(nonatomic, readonly) classb *(^ccc)(nsstring* str);

@implement classa

// 2. 實現這些 block 方法,block 返回值型別很關鍵,影響著下乙個鏈式

- (classa *(^)(bool))aaa

else

returnself;

}

}

- (classa *(^)(nsstring *))bbb

}

// 這裡返回了classb的乙個例項,於是後面就可以繼續鏈式 classb 的 block 方法

// 見下面例子 .ccc(@"objective-c").ddd(no)

- (classb * (^)(nsstring *))ccc

}

//------------------------------------------

@inte***ce classb : nsobject

@property(nonatomic, readonly) classb *(^ddd)(bool enable);

- (id)initwithstring:(nsstring *)str;

@implement classb

- (classb *(^)(bool))ddd

else

returnself;

}

}

// 最後我們可以這樣做

id a = [classanew];

a.aaa(yes).bbb(@"helloworld!").ccc(@"objective-c").ddd(no)

如何在Objective C中實現鏈式語法

在接觸到開源專案 masonry 後,裡面的布局約束的鏈式寫法讓我頗感興趣,就像下面這樣 1 2 3 4 5 6 7 8 uiedgeinsets padding uiedgeinsetsmake 10,10,10,10 view1 mas makeconstraints masconstraint...

Objective C 鏈式程式設計思想

鏈式程式設計就是將呼叫多個方法用點語法連線起來,讓 更加簡潔和可讀性更高 剛開始接觸鏈式程式設計是masonry,用起來真的非常爽 1 make.left.right.top.equalto self.view 這樣一句語句就呼叫了4個方法 left呼叫了left屬性的get方法 right,top...

objective c中的靜態函式實現

nsstring getcurrenttimestring 獲得字串格式的當前時間 nsstring getcurrenttimestring nsdate curtime nsdate date 獲取本地時間 nsdateformatter formatter nsdateformatter al...