8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Blockを使って変数スコープを作成するカテゴリ

Last updated at Posted at 2014-03-20

概要

NSObjectのカテゴリとして、「自分自身を引数にもつ」ブロックを呼び出すメソッドを作成しました。そのスコープ内では対象となるオブジェクトに好きな名前をつけられるので、特にUI関係のコードなどを非常に綺麗に書けるようになります。
説明よりも、下記サンプルを見るのが一番手っ取り早いです。

サンプルコード

通常の書き方

    self.longNameLabel.text = @"test";
    self.longNameLabel.font = [UIFont systemFontOfSize:15];
    self.longNameLabel.textAlignment = NSTextAlignmentCenter;
    self.longNameLabel.numberOfLines = 3;

###普通にスコープを使う場合
新しく宣言した変数はスコープから出る時に消滅しますが、元々ある変数を自由に変更することが出来ます。

  {
     UILabel *l = self.longNameLabel;
     l.text = @"test";
     l.font = [UIFont systemFontOfSize:15];
     l.textAlignment = NSTextAlignmentCenter;
     l.numberOfLines = 3;
  }

###スコープブロックを使う書き方
スコープ内では、__block宣言されていない変数は変更できません。

    [self.longNameLabel btk_scope:^(UILabel *l) {
        l.text = @"test";
        l.font = [UIFont systemFontOfSize:15];
        l.textAlignment = NSTextAlignmentCenter;
        l.numberOfLines = 3;
    }];

ソース

NSObject+BTKUtils.h
//
//  NSObject+BTKUtils.h
//  BTKCommons
//
//  Created by Tomohisa Ota on 3/20/14.
//
//

#import <Foundation/Foundation.h>

@interface NSObject (BTKUtils)

- (instancetype) btk_scope:(void (^)(id obj))scopedBlock;

@end
NSObject+BTKUtils.m
//
//  NSObject+BTKUtils.m
//  BTKCommons
//
//  Created by Tomohisa Ota on 3/20/14.
//
//

#import "NSObject+BTKUtils.h"

@implementation NSObject (BTKUtils)

- (instancetype) btk_scope:(void (^)(id obj))scopedBlock
{
    if(scopedBlock){
        scopedBlock(self);
    }
    return self;
}

@end
8
8
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
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?