체인 프로그래밍 - 01 - 블록

4893 단어
make.left.equalTo(superView.mas_left);

위의 이 코드를 어떻게 이해합니까
  • make.left 이것은 [make left] 방법에 해당하는 호출입니다.make 자체로 돌아갑니다.그래서 위의 코드가make를 실행했습니다.left 후 아래 코드가 됩니다:
  • make.equalTo(superView.mas_left);
    
  • 이 코드는 왼쪽에서 오른쪽으로 실행되고 먼저make로 실행됩니다.equalTo 다음에 실행 괄호 안에 있는 내용입니다.
  • 참고:
  • equalTo의 반환값은 Block 형식이어야 equalTo(...)가 있습니다.이 방법

  • Block 확장


    프로그래머가 코드를 쓸 때 습관적으로 쓰는 방법은 다음과 같다.
    //       
    - (NSString *)test1 {
        return @"123";
    }
    
    //          
    [self test1];
    
    //           
    self.test1;
    

    그러나 이런 문법은 방법 뒤에 나타나 괄호를 따라갈 수 없다. 예를 들어
    self.test1();
    

    그러나 반환 값이 Block 형식일 때 위의 맞춤법을 사용할 수 있습니다.
    - (void(^)(void))test2 {
        
        NSLog(@"    test2");
        
        void(^block)(void) = ^ {
            NSLog(@"    test2     block");
        };
        
        return block;
    }
    

    호출test2
        //     self.test2     ,    block     
        self.test2;
        
        NSLog(@" -----       ----- ");
        
        //         ,     block   
        self.test2();
    
    
    //      :
    
    2018-08-07 16:15           test2
    
    2018-08-07 16:15       -----       ----- 
    
    2018-08-07 16:15           test2
    2018-08-07 16:15           test2     block
    
    self.test2() 이렇게 호출, test2 의 호출 순서는 마지막으로 Block 블록의 코드를 호출합니다
    - (void(^)(void))test3 {
        
        NSLog(@"1");
        
        void(^block)(void) = ^ {
            NSLog(@"3 -     block");
        };
        
        NSLog(@"2");
        return block;
    }
    
    

    인쇄 결과
    2018-08-07 16:24      1
    2018-08-07 16:24      2
    2018-08-07 16:24      3 -     block
    

    연습하다


    덧셈 계산기 만들기

    대상을 향한 쓰기

  • 새 클래스, 이름은 WYCalculator Manager
  • 입니다.
  • 이 클래스에는 덧셈 방법과 결과 속성이 있다
  • 외부에서 이 방법을 사용하고 덧셈 방법
  • 을 사용한다.
    @interface WYCalculatorManager : NSObject
    
    ///      
    @property (nonatomic, assign) NSInteger result;
    
    
    /**
           
    
     @param value      
     */
    - (void)add:(NSInteger)value;
    @end
    
    
    @implementation WYCalculatorManager
    
    - (WYCalculatorManager *)add:(NSInteger)value
    {
        _result += value;
        
        return  self ;
    }
    @end
    
    #import "WYCalculatorManager.h"
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        WYCalculatorManager *cal = [[WYCalculatorManager alloc] init];
        [cal add:3];
        
    }
    
  • 덧셈을 여러 번 계산하려면dd방법
  • 을 계속 호출해야 한다.
     [cal add:3];
     [cal add:3];
     [cal add:3];
     [cal add:3];
     [cal add:3];
    
  • 이렇게 하는 것은 매우 피곤하다. 왜냐하면 계속 줄을 바꿔야 하기 때문에cal도 한 줄로 써야 한다. 그러면 계속 한 줄로 쓸 수 있다면 더욱 좋지 않겠니?
  • WYCalculatorManager *cal = [[WYCalculatorManager alloc] init];
     [[[[[cal add:3] add:3] add:3] add:3] add:3];
    

    체인 지향
  • 한 줄에 여러 번 쓰려면 체인 프로그래밍
  • 을 고려할 수 있다.
  • 방법의 반환값을void에서 자신으로 바꾸기만 하면 된다( *)
  • #import 
    
    @interface WYCalculatorManager : NSObject
    
    ///      
    @property (nonatomic, assign) NSInteger result;
    
    
    /**
            ->     
    
     @param value      
     */
    // - (void)add:(NSInteger)value;
    
    
    /**
             ->       
     
     @param value      
     */
    - (WYCalculatorManager * )add:(NSInteger)value;
    @end
    
    
        WYCalculatorManager *cal = [[WYCalculatorManager alloc] init];
        [[[[[cal add:3] add:3] add:3] add:3] add:3];
    
  • 그런데 이렇게 많으면 귀찮아요. 중괄호가 많아서 나중에 하나를 삭제하려면 앞에 있는 중괄호도 하나 삭제해야 돼요.
  • 변환가능car.add(3).add(3).add(3).add(3).add(3)
  • 가장 간단한 것부터 시작하고 파라미터가 없는 것
  • //           add: (NSInterger)value
    //          ,    ,     
    - (void(^)(void))add;
    
    //    :
    WYCalculatorManager *cal = [[WYCalculatorManager alloc] init];
    //        add,   block         
    //       ,   block     ,    ,               NSInterger
      cal.add();
    
  • Block에 매개 변수가 있고 반환값이 없음
  • //          ,    ,    
    - (void(^)(NSInteger))add;
    
    //    :
     cal.add(3);
    

    6.1 .m의 맞춤법
    - (void (^)(NSInteger))add {
        
        void(^block)(NSInteger) = ^(NSInteger value) {
            _result += value;
        };
        
        return block;
    }
    

    6.2 단순화:
    - (void (^)(NSInteger))add {
        
       return ^(NSInteger value) {
            _result += value;
        };
    }
    

    6.3add(5):
    ^(NSInteger value) {
            _result += value;
     }(5);
    
  • 되돌아오는 값이 있고 매개 변수가 있는 Block 쓰기
  • .h   
    //    ,    
    - (WYCalculatorManager *(^)(NSInteger))add;
    
    .m   :
    - (WYCalculatorManager *(^)(NSInteger))add {
        
       return ^(NSInteger value) {
            _result += value;
           
           return self;
        };
    }
    
      :
    
     WYCalculatorManager *cal = [[WYCalculatorManager alloc] init];
     cal.add(3).add(3).add(3).add(3).add(3);
    
    

    좋은 웹페이지 즐겨찾기