Objective-Cでカテゴリーを実装する際に hogehoge.ex.foo() のようにプロパティを噛ましたい
はじめに
こちらは先日投稿した SwiftでExtensionを実装する際に hogehoge.ex.foo() のようにプロパティを噛ましたい - Qiita の Objective-C 版になります.
Objective-Cを使ってる(た)人なら,タイトルは [[hogehoge ex] foo]
や [hogehoge.ex foo]
なのでは?だと誤りと思いますが,最近Objective-Cを使うならメインをSwiftにしてだろうと思って,このようにしてます.Objective-Cだけを使う人は置き換えて見て下さい.
カテゴリーを作る
UITableViewにカテゴリーを生やす例で紹介します.以下のクラス名などは任意で適当に付けています.
カテゴリー用の変数を作る
まずカテゴリー用のクラス MyExtension
を作成します.このクラスから生成した変数から,カテゴリーを作りたいインスタンスにアクセスします.
@interface MyExtension : NSObject
@end
@interface MyExtension ()
@property (nonatomic, weak) UITableView *tableView;
- (instancetype)initWithTableView:(UITableView *)tableview;
@end
@implementation MyExtension
- (instancetype)initWithTableView:(UITableView *)tableview{
self = [super init];
if (self) {
self.tableView = tableview;
}
return self;
}
@end
カテゴリー用の変数を生やす
作成したカテゴリー用のクラスを,カテゴリーを作成したいクラスに適用します.associate機能を使って,カテゴリーで変数を追加します.
@interface UITableView (extension)
@property (nonatomic, retain) MyExtension* ex;
@end
#import <objc/runtime.h>
static void *MyExtensionKey = &MyExtensionKey;
@implementation UITableView (extension)
- (MyExtension*)ex{
MyExtension *temp = objc_getAssociatedObject(self, MyExtensionKey);
if (temp == nil){
temp = [[TableViewExtension alloc] initWithTableView:self];
[self setEx:temp];
}
return temp;
}
- (void)setEx:(MyExtension *)ex{
objc_setAssociatedObject(self,
MyExtensionKey,
ex,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
カテゴリーのメソッドを追加する
最初に作成した MyExtension
にメソッドを追加しています.
@interface MyExtension : NSObject
- (void)foo;
@end
@implementation MyExtension
- (void)foo{
UITableView *tableView = self.tableView;
// 処理
}
@end
まとめ
今更 Objective-C で新規開発する場面は少なくなったと思いますが,これで Objective-C でもカテゴリーで追加するメソッドを変数を噛ませて使用できます(あまり使用シーンはないと思いますが).私は最近SwiftからObjective-Cの機能を使いたくて作ってみました( こちら ).この記事は実際のソースではどうなっているか気になる方はどうぞ.
Author And Source
この問題について(Objective-Cでカテゴリーを実装する際に hogehoge.ex.foo() のようにプロパティを噛ましたい), 我々は、より多くの情報をここで見つけました https://qiita.com/mitsuharu_e/items/4cbfa7c290b5c3f97395著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .