談到鏈式編程,那Masonry幾乎就是最經典的代表.如:
make.top.equalTo(self.view).offset(60)
像這樣top.equalTo(self.view).offset(60)
通過”點”語法,將需要執行的代碼塊連續的書寫下去,就是鏈式編程.它能使代碼簡單易讀,書寫方便
1.傳統寫法,兩個方法需要單獨調用,也不能任意組合順序
創建Person類
Person.h: - (void)eat1; - (void)sleep1;
Person.m: - (void)eat1 { NSLog(@"%s",__FUNCTION__); } - (void)sleep1 { NSLog(@"%s",__FUNCTION__); }
控制器中調用Person類中方法
ViewController.m: Person *person = [[Person alloc] init]; [person eat1]; [person sleep1];
2.用’[]’實現連續調用
Person.h: - (Person *)eat2; - (Person *)sleep2;
Person.m: - (Person *)eat2 { NSLog(@"%s",__FUNCTION__); return self; } - (Person *)sleep2 { NSLog(@"%s",__FUNCTION__); return self; }
ViewController.m:
[[person eat2] sleep2];
[[person sleep2] eat2];
3.用block實現鏈式
//person.eat3相當於get方法(很妙的自己可以試一下)
Person.h: - (void (^)())eat3; - (void (^)())sleep3;
Person.m: - (void (^)())eat3 { //定義block void (^eat3Block)() = ^ { NSLog(@"%s",__FUNCTION__); }; return eatBlock; } - (void (^)())sleep3 { return ^ { NSLog(@"%s",__FUNCTION__); };; }
ViewController.m:
person.eat3();
person.sleep3();
4.實現 鏈式(無參)
Person.h: - (Person * (^)())eat4; - (Person * (^)())sleep4;
Person.m: - (Person *(^)())eat4 { Person * (^eat4Block)() = ^ { NSLog(@"%s",__FUNCTION__); return self; }; return eat4Block; } //上下兩種寫法一樣 - (Person *(^)())sleep4 { return ^ { NSLog(@"%s",__FUNCTION__); return self; }; }
ViewController.m:
person.eat4().sleep4();
person.sleep4().eat4();
5.實現 鏈式(帶參)
//person.eat3相當於get方法(很妙的自己可以試一下) 返回值是block 調用block需要傳參數 int 調用block返回值是對象本身
Person.h: - (Person * (^)(NSString *foodName))eat5; - (Person * (^)(NSInteger hour))sleep5;
Person.m: - (Person *(^)(NSString *))eat5 { Person * (^eat5Block)() = ^(NSString *foodName) { NSLog(@"吃: %@",foodName); return self; }; return eat5Block; } //上下兩種寫法一樣 - (Person *(^)(NSInteger))sleep5 { return ^(NSInteger hour) { NSLog(@"睡了%ld小時",(long)hour); return self; }; }
ViewController.m: person.eat5(@"蛋糕").sleep5(8); person.sleep5(8).eat5(@"面包");