Help us understand the problem. What is going on with this article?

@dynamicを使って冗長なコードを排除しよう

More than 5 years have passed since last update.

入門書などではaddSubviewを行う際は、先ずオブジェクトを生成して、それをaddSubviewで対象のオブジェクトに追加するなどを行なっているかと思います。私自身も長らくそのようなソースの書き方をしておりました。この書き方は、何の処理をやっているのかが明確なので大変よいのですが、処理が少し冗長な気がします。

オブジェクトのインスタンス生成&初期化処理などをgetterメソッドに記述して、自身でわざわざインスタンス生成&初期化処理を行わなくても、使用する時(以下ではaddSubview実行時)にgetterメソッドを自動的に呼び出してもらいコード量を減らして処理をシンプルにすることが可能です。

これは@dynamicの活用例であります。

最近良く読む、オープンソースなどでこのような処理を多様しております。

@dynamicは省略できますが、ここではわかりやすいように記述しております。

@interface SampleView()
@property (nonatomic,strong) UIButton *leftArrow;
@property (nonatomic,strong) UIButton *rightArrow;
@end

@implementation SampleView

- (id)appendSubview
{
    // getterメソッドを自分で記述することによりaddSubviewをCallした時にインスタンスを生成している
    [self addSubview:self.leftArrow];
    [self addSubview:self.rightArrow];
}

@dynamic leftArrow; // 省略可能
- (UIButton *)leftArrow
{
    if(_leftArrow) return _leftArrow;

    _leftArrow = [UIButton buttonWithType:UIButtonTypeCustom];
    _leftArrow.tag = 0;
    _leftArrow.frame = CGRectMake(0, 0, 52, 36);
    _leftArrow.accessibilityLabel = @"Previous";
    [_leftArrow addTarget:self action:@selector(change:) forControlEvents:UIControlEventTouchUpInside];
    [_leftArrow setImage:[UIImage imageNamed:@"left_arrow"] forState:0];
    return _leftArrow;
}

@dynamic rightArrow; //省略可能
- (UIButton *)rightArrow
{
    if(_rightArrow) return _rightArrow;

    _rightArrow = [UIButton buttonWithType:UIButtonTypeCustom];
    _rightArrow.tag = 1;
    _rightArrow.frame = CGRectMake(VIEW_WIDTH-52, 0, 52, 36);
    _rightArrow.accessibilityLabel = @"Next";
    [_rightArrow addTarget:self action:@selector(change:) forControlEvents:UIControlEventTouchUpInside];
    [_rightArrow setImage:[UIImage imageNamed:@"right_arrow"] forState:0];
    return _rightArrow;
}

@end
TechMeetMeet
都内でフリーランサーとして働いています。自分の技術整理も兼ねてQitta&ブログに情報をのせていきます。 役立つ情報があったら、"いいね"や"ツイート"してもらえると、すごく嬉しいです。
http://tech.meetmeet.info
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away