OC代码使用链式编程

2018-02-04  本文已影响0人  淡暗
链式编程

用点语法把多个方法都连起来,形成一句代码,这样可读性强。比如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]];
  1. 简单的使用,不带参数的

类比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();
  1. 带参数的用法
//.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] 去美食街和小湖边散步
上一篇下一篇

猜你喜欢

热点阅读