読者です 読者をやめる 読者になる 読者になる

Rodhos Soft

備忘録を兼ねた技術的なメモです。

クラスで作ってみる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