iOSチェーンプログラミングの簡単な使用
5381 ワード
iOSチェーンプログラミングの簡単な使用
チェーンプログラミング-文字通り、チェーン、一貫性が主な特徴であり、プログラミング分野において、単純な点は一連のコード実行動作を直列に接続することであり、単独で1つずつ実行する必要はなく、MasonryとSDAutoLayoutフレームワークを用いて自動レイアウトを実現する際に、比較を行った.
Masonry:
SDAutoLayout:
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はtypedefと組み合わせて使用
自分でBlockタイプを定義し、定義したタイプでBlockを作成すると、より簡単で便利です.
ここではUIButtonのチェーンプログラミング実装の例を挙げる
CHButton.h
CHButton.m
使用方法:ファクトリモードでCHButtonを作成する
まとめ
チェーンプログラミングは自身に戻り、各チェーンメソッドは明確なタイプを返さなければならず、protocolを使用したり継承したりすることはできません.各メソッドの宣言時にオブジェクトのタイプを明確に返さなければなりません.したがって、チェーンファイルには、クラスのメソッド宣言だけでなく、親クラスのメソッド宣言もあります.
その後、よりペアのクラスをチェーン化し、開発の効率を高めます.
チェーンプログラミング-文字通り、チェーン、一貫性が主な特徴であり、プログラミング分野において、単純な点は一連のコード実行動作を直列に接続することであり、単独で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の実現構想を理解しています.チェーンプログラミングの考え方です.
チェーンプログラミング
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を使用したり継承したりすることはできません.各メソッドの宣言時にオブジェクトのタイプを明確に返さなければなりません.したがって、チェーンファイルには、クラスのメソッド宣言だけでなく、親クラスのメソッド宣言もあります.
その後、よりペアのクラスをチェーン化し、開発の効率を高めます.