クラスで作ってみるIF
Objective-C Advent Calendar 2014に登録していたのですが何もネタが思いつかなかったので、クラスで最小の部品を作ってみようかと思い作ってみました。
クラスIFです。
KatagiriSo/IF · GitHub
使い方は
//ex1 int a = -3; [[IF Condition:((a>=0) ? OK.new : nil) Action:[Do b:^{NSLog(@"a=>0");return OK.new;}] Else:[IF Condition:((a<0) ? OK.new : nil) Action:[Do b:^{NSLog(@"a<0");return OK.new;}] Else:NG.new] ] do];
‥汚いですね。
IFクラスの引数はDoプロトコルを持ちます。
@protocol Do <NSObject> - (id<Do>)do; @end
クラス定義です。
typedef id<Do>(^DoBlock)(void); @interface IF : NSObject <Do> + (IF*)Condition:(id<Do>)condition Action:(id<Do>)d Else:(id<Do>)e; - (DoBlock)getDoBlock; @property (nonatomic) id<Do>Action; @property (nonatomic) id<Do>Condition; @property (nonatomic) id<Do>Else; @end
ConditionにはOKならOKクラスを入れます。
その場合にActionが実行されます。
単なるクラスなので変数に入れられます。あとBlocksにも変換できたり、返り値としてDoプロトコル
が得られたりします。
IF *iff = [IF Condition:((a>=0) ? OK.new : nil) Action:[Do b:^{NSLog(@"a=>0");return OK.new;}] Else:[IF Condition:((a<0) ? OK.new : nil) Action:[Do b:^{NSLog(@"a<0");return OK.new;}] Else:NG.new] ]; DoBlock doblock = iff.getDoBlock; doblock();
何かに使えないか。。
注 Doクラス、OKクラス
@interface Do : NSObject<Do> @property (nonatomic, copy) DoBlock doblock; + b:(DoBlock)doBlock; @end
@interface OK : NSObject<Do> @end @implementation OK - (id <Do>)do { return OK.new; } @end