こういう書き方をすればコードが見やすくなるかもってお話だよ。
ボタンやラベルでもなんでもいいんだけど、ビューにいくつか置きたいとするよ。
で、ひとつのボタンを置くメソッドも書いたとするね。このメソッドを何回もコールするという流れ。
こんな感じで呼び出すことはできるよね。
{
[self putButtonAtPoint:CGPointMake(10, 10) title:@"Male, Height" tag:MALE_HEIGHT];
[self putButtonAtPoint:CGPointMake(10, 50) title:@"Female, Height" tag:FEMALE_HEIGHT];
[self putButtonAtPoint:CGPointMake(10, 90) title:@"Male, Weight" tag:MALE_WEIGHT];
[self putButtonAtPoint:CGPointMake(10, 130) title:@"Female, Weight" tag:FEMALE_WEIGHT];
}
でも実際には表示する位置に数字をダイレクトで入れとくと後々変更したい時に面倒だったり、そもそも計算するのが面倒だったりするよね。
そこで変数を使ってみるとこんな感じに書けるよね。
{
float xx = 10.f , yy = 10.f , dY = 40.f;
[self putButtonAtPoint:CGPointMake(xx, yy) title:@"Male, Height" tag:MALE_HEIGHT];
yy += dY;
[self putButtonAtPoint:CGPointMake(xx, yy) title:@"Female, Height" tag:FEMALE_HEIGHT];
yy += dY;
[self putButtonAtPoint:CGPointMake(xx, yy) title:@"Male, Weight" tag:MALE_WEIGHT];
yy += dY;
[self putButtonAtPoint:CGPointMake(xx, yy) title:@"Female, Weight" tag:FEMALE_WEIGHT];
}
これなら計算しなくてもいいからラクになったけど、y座標変更の命令 yy += dY; のおかげで縦に伸びてしまったのがなんかイヤ。そうでもない?俺はなんだかイヤだなあと思っちゃうんだよ。
で、何かいい方法はないかなあと思って試してみたらこんな記述ができるんだね。
{
float xx = 10.f , yy = 10.f , dY = 40.f;
[self putButtonAtPoint:CGPointMake(xx, yy) title:@"Male, Height" tag:MALE_HEIGHT];
[self putButtonAtPoint:CGPointMake(xx, yy += dY) title:@"Female, Height" tag:FEMALE_HEIGHT];
[self putButtonAtPoint:CGPointMake(xx, yy += dY) title:@"Male, Weight" tag:MALE_WEIGHT];
[self putButtonAtPoint:CGPointMake(xx, yy += dY) title:@"Female, Weight" tag:FEMALE_WEIGHT];
}
なんか不思議じゃない?さんざん離婚裁判で殴り合いしといて最後に訴え取り下げでなかったことって何だよ?って感じだよ。
これでいけるということは yy += dY; という演算を先にやってその演算後のyyの値を使ってくれてるってことだよね。
これ、かなりスッキリするわ。まあ喜んでいるのは俺だけかもしれないけどさ。
そうそう、最近のXcodeだとCGPointMakeうんぬんを { xx , yy } のように記述できるようになったよね。モダンObjective-Cって言うのかな。
これを使うとこんな風になるんだ。1行目が元ので2行目のが新しい記述方法の場合。
{
// [self putButtonAtPoint:CGPointMake(xx, yy) title:@"Male, Height" tag:MALE_HEIGHT];
[self putButtonAtPoint:(CGPoint){xx, yy} title:@"Male, Height" tag:MALE_HEIGHT];
// [self putButtonAtPoint:{xx, yy} title:@"Male, Height" tag:MALE_HEIGHT];//ERROR!
}
キャストが必要になる(3つ目のはエラーでビルドしてくれない)のでさほど小さくなるわけじゃないけど、これもコードをスッキリさせてくれるかな。
ここまで書いてふとキャスト要でCGPointって書くんだからメソッド名に"Point"って書くことないよな、だぶってるよな、なんて思ったよ。
{
float xx = 10.f , yy = 10.f , dY = 40.f;
[self putButtonAt:(CGPoint){xx, yy} title:@"Male, Height" tag:MALE_HEIGHT];
[self putButtonAt:(CGPoint){xx, yy += dY} title:@"Female, Height" tag:FEMALE_HEIGHT];
[self putButtonAt:(CGPoint){xx, yy += dY} title:@"Male, Weight" tag:MALE_WEIGHT];
[self putButtonAt:(CGPoint){xx, yy += dY} title:@"Female, Weight" tag:FEMALE_WEIGHT];
}
ふんふん、これなら数ヶ月後に見ても何やってるのかすぐにわかるわ。メソッド名も大事だよね。