LoginSignup
7
7

More than 5 years have passed since last update.

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

Posted at

入門書などでは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
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7