在接觸到開源專案 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
return
self;
}
}
- (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
return
self;
}
}
// 最後我們可以這樣做
id a = [classa
new
];
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...