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