iOS 之Masonry點語法簡單實現(xiàn) OC鏈?zhǔn)?點)語法

常見的OC中括號鏈?zhǔn)秸Z法

[[someClass alloc] init];

Masonry

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.equalTo(superview.mas_top).with.offset(padding.top);
    make.left.equalTo(superview.mas_left).with.offset(padding.left);
    make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
    make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];

上圖:
image.png
  • 點語法:在 Objective-C 中稍途,對于點語法的使用决乎,最常見于屬性的訪問毁兆,比如對在方法內(nèi)部用 self.xxx想许,在類的實例中用 classInstance.xxx河泳;

  • 小括號調(diào)用:Objective-C 中一般用中括號 [] 來實現(xiàn)方法的調(diào)用沃呢,而對于 Block 的調(diào)用則還是保留使用小括號 () 的方式,因此我們可以考慮用 Block 來實現(xiàn)在鏈?zhǔn)秸Z法中的 () 拆挥;

  • 如何實現(xiàn)連續(xù)訪問薄霜?:Block 可理解為帶有自動變量的匿名函數(shù)或函數(shù)指針,它也是有返回值的。我們可以把上述類實例每次方法的調(diào)用(實質(zhì)為 Block 的調(diào)用)的返回值都設(shè)為當(dāng)前類實例本身惰瓜,即 classInstance.method1() 返回了當(dāng)前 classInstance否副,此時可在其后面繼續(xù)進行 .method2() 的調(diào)用,以此類推鸵熟。

總結(jié)一句話就是:
“我們可以定義類的一些只讀的 Block 類型的屬性副编,并把這些 Block 的返回值類型設(shè)為當(dāng)前類本身,然后實現(xiàn)這些 Block 屬性的 getter 方法流强”越欤”

代碼實踐:

// .h 文件
@interface Calculator : NSObject

@property (nonatomic, assign) NSInteger result;//計算結(jié)果
@property (nonatomic, copy, readonly) Calculator *(^add) (NSInteger num);
@property (nonatomic, copy, readonly) Calculator *(^minus) (NSInteger num);
@property (nonatomic, copy, readonly) Calculator *(^multiply) (NSInteger num);
@property (nonatomic, copy, readonly) Calculator *(^devide) (NSInteger num);
// 或者這樣實現(xiàn)也可以
- (Calculator *(^)(NSInteger num)) add;
- (Calculator *(^)(NSInteger num)) minus;
- (Calculator *(^)(NSInteger num)) multiply;
- (Calculator *(^)(NSInteger num)) devide;
@end
// .m 文件
@implementation Calculator

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.result = 0;
    }
    return self;
}

- (Calculator * _Nonnull (^)(NSInteger))add{
    return ^id(NSInteger num){
        self.result += num;
        return self;
    };
}

- (Calculator * _Nonnull (^)(NSInteger))minus{
    return ^id(NSInteger num){
        self.result -= num;
        return self;
    };
}

- (Calculator * _Nonnull (^)(NSInteger))multiply{
    return ^id(NSInteger num){
        self.result *= num;
        return self;
    };
}

- (Calculator * _Nonnull (^)(NSInteger))devide{
    return ^id(NSInteger num){
        NSAssert(num != 0, @"除數(shù)不能為零!4蛟隆队腐!");
        self.result *= num;
        return self;
    };
}

測試代碼

Calculator *calc = [[Calculator alloc] init];
calc.add(10).minus(4).multiply(2).devide(3);
NSLog(@"%d",(int)calc.result);

分析:

上面通過 calc.add 訪問 calc 的 add 屬性會調(diào)用 [calc add] 方法,此方法會返回一個 Block 如下:
^id(NSInteger num) {
self.result += num;
return self;
};
在這個 Block 中奏篙,前面已聲明其返回值類型為:Calculator柴淘,所以在其里面返回了 self,
這樣當(dāng)調(diào)用該 Block 時秘通,會返回 self(即類實例本身)为严,流程如下:
(1) calc.add -> 獲得一個 Block;
(2) calc.add(8) -> Block 的執(zhí)行肺稀,并返回了 self(即實例 calc)
(3) 于是在 calc.add(8) 后面可繼續(xù)訪問 calc 的其他屬性第股,實現(xiàn)一路點下去...

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市话原,隨后出現(xiàn)的幾起案子夕吻,更是在濱河造成了極大的恐慌,老刑警劉巖繁仁,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涉馅,死亡現(xiàn)場離奇詭異,居然都是意外死亡黄虱,警方通過查閱死者的電腦和手機稚矿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捻浦,“玉大人盐捷,你說我怎么就攤上這事∧矗” “怎么了碉渡?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長母剥。 經(jīng)常有香客問我滞诺,道長形导,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任习霹,我火速辦了婚禮朵耕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淋叶。我一直安慰自己阎曹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布煞檩。 她就那樣靜靜地躺著处嫌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斟湃。 梳的紋絲不亂的頭發(fā)上熏迹,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音凝赛,去河邊找鬼注暗。 笑死,一個胖子當(dāng)著我的面吹牛墓猎,可吹牛的內(nèi)容都是我干的捆昏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼毙沾,長吁一口氣:“原來是場噩夢啊……” “哼骗卜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搀军,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤膨俐,失蹤者是張志新(化名)和其女友劉穎勇皇,沒想到半個月后罩句,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡敛摘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年门烂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兄淫。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡屯远,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捕虽,到底是詐尸還是另有隱情慨丐,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布泄私,位于F島的核電站房揭,受9級特大地震影響备闲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捅暴,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一恬砂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蓬痒,春花似錦泻骤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粹断,卻和暖如春符欠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓶埋。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工希柿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人养筒。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓曾撤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晕粪。 傳聞我的和親對象是個殘疾皇子挤悉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容