2011年5月20日金曜日

Objective-Cでメソッドチェーン

//  JQ.h

//    ブロック構文のプロパティを作る

//    ブロックは自身と同一なクラスを返すようにする

//    引数はなんでも良い


@property (nonatomic, retain) JQ* (^call)(const char *);


//  JQ.m

//    たとえば自分に変更を加えたり、新しく作ったりして返す


- (JQ *(^)(const char *))call

{

  JQ* (^method)(const char *) = (JQ *(^)(const char *))(^(const char *statement) {

    [self add:statement];

    return self;

  });

  

  return method;

}


- (void)somewhere

{

  self.call("test1").call("test2").call("test3").call("test4").call("test5");

}

block構文 その2

プロパティとして使う場合 (ブロック構文の読み書き)

@property (nonatomic, retain) NSString* (^convert)(NSString *);

メソッドとして使う場合(ブロック構文を返すgetter)

- (NSString *(^)(NSString *))convert;

ややこしいですね。

2011年5月19日木曜日

block構文

型定義いつも忘れるのでメモ。


void (^move)(UIView*, CGRect) = ^(UIView* view, CGRect frame) {
  [view setFrame:frame];
};
  
move(view, CGRectMake(0, 0, 100, 100));

普通に作るときはこんなで、


- (void)animation:(void (^)(UIView* view, CGRect frame))moving;

[self animation:^(UIView* view, CGRect frame) {
  [view setFrame:frame];
}];

関数の引数にするときはこんなん。