1. 程式人生 > >一步一步教你理解和實現iOS中的鏈式程式設計和函數語言程式設計

一步一步教你理解和實現iOS中的鏈式程式設計和函數語言程式設計

談到鏈式程式設計和函數語言程式設計,那Masonry幾乎就是最經典的代表.如:

make.top.equalTo(self.view).offset(60)

像這樣top.equalTo(self.view).offset(60)通過”點”語法,將需要執行的程式碼塊連續的書寫下去,就是鏈式程式設計.它能使程式碼簡單易讀,書寫方便

像這樣equalTo(self.view)通過’()’去呼叫函式,一般呼叫完返回的還是這個物件本身,就是函數語言程式設計.

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.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.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(@"麵包");