實現iOS中的鏈式編程


談到鏈式編程,那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(@"面包");

 





 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM