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

2021-09-07 07:06:22 字數 3554 閱讀 8941

在接觸到開源專案 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)

HTTPS 證書處理 objective c實現

前一篇文章用c 處理了證書,這次就使用oc來試一下,其實基本原理累似,一般都是自己覆蓋幾個函式,然後自己處理證書相關的東西。自己建立乙個類,如 inte ce myurlconnection nsobject void sendpostrequest nsurl url postdata nsdat...

如何在程式中延時

方法一 使用sleep函式,如延時2秒,用sleep 2000 方法二 使用sleep函式的不利在於延時期間不能處理其他的訊息,如果時間太長,就好象宕機一樣,利用coledatetime類和coledatetimespan類實現延時就不會出現那樣的問題 coledatetime start time...

如何在jupyter notebook中顯示目錄?

如何在jupyter notebook中顯示目錄?通過目錄,能很清楚看到文字的構架。下面就介紹jupyter notebook安裝目錄外掛程式的步驟。1.首先,在anaconda prompt anaconda3 裡執行 pip install jupyter contrib nbextension...