iOSチェーンプログラミングの簡単な使用

5381 ワード

iOSチェーンプログラミングの簡単な使用
チェーンプログラミング-文字通り、チェーン、一貫性が主な特徴であり、プログラミング分野において、単純な点は一連のコード実行動作を直列に接続することであり、単独で1つずつ実行する必要はなく、MasonryとSDAutoLayoutフレームワークを用いて自動レイアウトを実現する際に、比較を行った.
Masonry:
[View mas_makeConstraints:^(MASConstraintMaker *make) {
      make.top.equalTo(anotherView);
      make.left.equalTo(anotherView);
      make.width.mas_equalTo(@60);
      make.height.mas_equalTo(@60);
}];

SDAutoLayout:
View.sd_layout
.leftSpaceToView(self.view, 10)
.topSpaceToView(self.view, 80)
.heightIs(130)
.widthRatioToView(self.view, 0.4);  

2つの実装方法を比較すると、SDAutoLayoutは比較的簡単で、コード量が少なく、理解と使用が容易です.
ここでは、この2つのフレームワークについて、MasonryとSDAutoLayoutの実現構想を理解しています.チェーンプログラミングの考え方です.
チェーンプログラミング
  • チェーンプログラミング思想:複数の操作(複数行コード)をドット(.)でリンクして1つのコードにし、コードの可読性を良くする.a(1).b(2).c(3)
  • チェーンプログラミングの特徴:方法の戻り値はblockであり、blockには戻り値(自身のオブジェクト)、blockパラメータ(操作が必要な値)
  • が必要である.
  • 代表:Masonryフレーム、SDAutoLayoutフレーム
  • チェーンプログラミングのもう一つのキー-block:
    Blockの定義形式
    戻り値タイプ(^block変数名)(パラメータリスト)=^(パラメータリスト){};Blockが保存したコードblock変数名(実パラメータ)を呼び出す.
    デフォルトでは、Block内部では外部のローカル変数を変更できません.Block内部では使用を変更できます.block修飾の局所変数
    Blockのモード
    1.パラメータなし戻り値なしBlock 2.パラメータなし戻り値なしBlock 3.パラメータあり戻り値ありBlock
    Blockの簡単な使い方の例
    パラメータなし戻り値なしBlock
    /**
     *          Block
     */
    -(void)func1{
        /**
         *  void :      
         *  emptyBlock:   block   
         *  ():        。        ,        
         */
        void (^emptyBlock)() = ^(){
            NSLog(@"   ,     Block");
        };
        emptyBlock();
    }
            Block
    
    /**
         *      block        
         *
         *  @param int   A
         *  @param int   B
         *
         *  @return     
         */
        void (^sumBlock)(int ,int ) = ^(int a,int b){
            NSLog(@"%d + %d = %d",a,b,a+b);
        };
        /**
         *      sumBlock Block,      20
         */
        sumBlock(10,10);
            Block
    
    /**
         *         
         *
         *  @param NSString    1
         *  @param NSString    2
         *
         *  @return          3
         */    
        NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){
            return [NSString stringWithFormat:@"%@%@",str1,str2];
        };
        //  logBlock,       Block
        NSLog(@"%@", logBlock(@"  ",@"Block"));
    

    Blockはtypedefと組み合わせて使用
    自分でBlockタイプを定義し、定義したタイプでBlockを作成すると、より簡単で便利です.
    ここではUIButtonのチェーンプログラミング実装の例を挙げる
    CHButton.h
    //
    //  CHButton.h
    //  testDemo
    //
    //  Created by     on 2017/4/13.
    //  Copyright © 2017  sxh. All rights reserved.
    //
    
    #import 
    
    @class CHButton;
    
    //typedef      CHButton*    NSString*     ChainButtonStringBlock block,           block
    
    typedef CHButton *(^ChainButtonStringBlock)(NSString *aName);
    
    typedef CHButton *(^ChainButtonIntegerBlcok)(NSUInteger aNumber);
    
    typedef CHButton *(^ChainButtonColorBlock)(UIColor *aColor);
    
    typedef CHButton *(^ChainButtonFrameBlock)(CGRect aframe);
    
    @interface CHButton : UIButton
    
    
    - (ChainButtonStringBlock)imageName;
    
    - (ChainButtonStringBlock)title;
    
    - (ChainButtonIntegerBlcok)titleFont;
    
    - (ChainButtonColorBlock)textColor;
    
    - (ChainButtonFrameBlock)btnframe;
    
    
    //        ,        ChainButton,      block              ChainButton
    + (CHButton *)makeJJButton:(void (^)(CHButton *))block;
    
    
    @end
    
    

    CHButton.m
    //
    //  CHButton.m
    //  testDemo
    //
    //  Created by     on 2017/4/13.
    //  Copyright © 2017  sxh. All rights reserved.
    //
    
    #import "CHButton.h"
    
    @implementation CHButton
    
    - (ChainButtonStringBlock)imageName{
        return ^CHButton *(NSString *aName){
            [self setImage:[UIImage imageNamed:aName] forState:UIControlStateNormal];
            NSLog(@"imageName");
            return self;
        };
    }
    
    - (ChainButtonStringBlock)title{
        return ^CHButton *(NSString *aName){
            [self setTitle:aName forState:UIControlStateNormal];
            NSLog(@"title");
            return self;
        };
    }
    
    - (ChainButtonIntegerBlcok)titleFont{
        return ^CHButton *(NSUInteger aNumber){
            self.titleLabel.font = [UIFont systemFontOfSize:aNumber];
            NSLog(@"titleFont");
            return self;
        };
    }
    
    - (ChainButtonColorBlock)textColor{
        return ^CHButton *(UIColor *aColor){
            [self setTitleColor:aColor forState:UIControlStateNormal];
            NSLog(@"textColor = %@",aColor);
            return self;
        };
    }
    
    - (ChainButtonFrameBlock)btnframe{
        return ^CHButton *(CGRect btnframe){
            [self setFrame:btnframe];
            return self;
        };
    }
    
    + (CHButton *)makeJJButton:(void (^)(CHButton *))block{
        CHButton * button = [[CHButton alloc] init];
        block(button);
        return button;
    }
    
    
    @end
    

    使用方法:ファクトリモードでCHButtonを作成する
    [CHButton makeJJButton:^(CHButton *button) {
            button.title(@"xixixi").imageName(@"abc").titleFont(20).textColor([UIColor orangeColor]).btnframe(CGRectMake(100, 100, 100, 100));
            button.frame = CGRectMake(100, 250, 100, 100);
            [self.view addSubview:button];
            [button addTarget:self action:@selector(didClick:) forControlEvents:UIControlEventTouchUpInside];
        }];
    

    まとめ
    チェーンプログラミングは自身に戻り、各チェーンメソッドは明確なタイプを返さなければならず、protocolを使用したり継承したりすることはできません.各メソッドの宣言時にオブジェクトのタイプを明確に返さなければなりません.したがって、チェーンファイルには、クラスのメソッド宣言だけでなく、親クラスのメソッド宣言もあります.
    その後、よりペアのクラスをチェーン化し、開発の効率を高めます.