链式编程
用点语法把多个方法都连起来,形成一句代码,这样可读性强。比如Masonry。
0.简单的栗子
OC中,我们用到最多的点语法可能就是获取属性了。如self.view.backgroundColor = [UIColor yellowColor];
self.view是get方法获取了view属性,后面的是set方法 ,用=右边的来赋值。
//上面的方法可以拆分成
UIView * tempView = [self view];//self.view
//.backgroundColor = [UIColor yellowColor]//暂且看需要传参数的点方法吧
[tempView setBackgroundColor:[UIColor yellowColor]];
-
简单的使用,不带参数的
类比get方法有返回值,没有参数,想要做到obj.xxx.yyy.zzz。新建一个Dog类,有三个方法,吃饭,睡觉,散步。每个方法都log输出一下。由于这三个方法都需要类的实例来实现,所以返回值是自身。
//Dog.h文件中
-(Dog*)eat;
-(Dog*)sleep;
-(Dog*)walk;
//Dog.m中
-(Dog*)eat{
NSLog(@"吃饭");
return self;
}
//
//
Dog *dog = [Dog new];
dog.eat.sleep.walk;
//打印结果
chainProgramming[10978:859266] 吃饭
chainProgramming[10978:859266] 睡觉
chainProgramming[10978:859266] 散步
可以运行,但是会有一个警告 Property access result unused - getters should not be used for side effects。属性返回值没有被使用,也就是return self没有被接收。Xcode把这些方法都认成了某个属性的get方法了,并且提示说get方法不应该有干别的事(副作用),只老老实实的返回值就行了。当然你可以dog=dog.eat.sleep.walk;可以用,也没有警告。
正确的做法是返回一个block,代码可以修改为
//Dog.h文件中
-(Dog*(^)(void))eat;
-(Dog*(^)(void))sleep;
-(Dog*(^)(void))walk;
//Dog.m中
-(Dog*(^)(void))eat{
NSLog(@"吃饭");
return ^(){
return self;
};
}
//
dog.eat().sleep().walk();
- 带参数的用法
//.h
-(Dog*)eat;
-(Dog*(^)(int y))sleep;
-(Dog*(^)(NSString* x,NSString* y))walk;
//.m
-(Dog*)eat{
NSLog(@"吃饭");
return self;
}
-(Dog*(^)(int y))sleep{
return ^(int y ){
NSLog(@"睡觉%d分钟",y);
return self;
};
}
-(Dog*(^)(NSString* x,NSString *y))walk{
return ^(NSString* x,NSString *y){
NSLog(@"去%@和%@散步",x,y);
return self;
};
}
//vc
dog.eat.sleep(100).walk(@"美食街",@"小湖边");
chainProgramming[11710:942872] 吃饭
chainProgramming[11710:942872] 睡觉100分钟
chainProgramming[11710:942872] 去美食街和小湖边散步