web-dev-qa-db-ja.com

Objective-Cのメソッドをパラメーターとして渡す

あるメソッドをパラメーターとして別のメソッドにどのように渡しますか?クラス全体でこれを行っています。

クラスA:

+ (void)theBigFunction:(?)func{
    // run the func here
}

クラスB:

- (void)littleBFunction {
    NSLog(@"classB little function");
}

// somewhere else in the class
[ClassA theBigFunction:littleBFunction]

クラスC:

- (void)littleCFunction {
    NSLog(@"classC little function");
}

// somewhere else in the class
[ClassA theBigFunction:littleCFunction]
29
Jacksonkr

探している型はセレクター(SEL)であり、メソッドのセレクターは次のようになります。

SEL littleSelector = @selector(littleMethod);

メソッドがパラメータを取る場合は、:どこに行くか、このように:

SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:);

また、メソッドは実際には関数ではなく、特定のクラス(+で始まる場合)またはその特定のインスタンス(-で始まる場合)にメッセージを送信するために使用されます。関数は、メソッドのように「ターゲット」を実際には持たないCタイプです。

セレクターを取得したら、次のようにターゲット(クラスまたはインスタンス)でそのメソッドを呼び出します。

[target performSelector:someSelector];

この良い例は、UIControlの-​​ addTarget:action:forControlEvents: メソッドを使用して、UIButtonまたは他のコントロールオブジェクトをプログラムで作成するときに通常使用します。

45
Filip Radelic

別のオプションは、ブロックを調べることです。コードのブロック(クロージャー)を渡すことができます。

これがブロックの良い書き方です:

http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

Apple docs:

http://developer.Apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

8
bryanmac

Objective Cはこの操作を比較的簡単にします。 Appleは このドキュメント を提供します。

質問に直接取り組むには、関数ではなくセレクタを呼び出します。ここにいくつかのサンプルコードがあります:

大きな機能:

+ (void)theBigFunction:(SEL)func fromObject:(id) object{
    [object preformSelector:func]
}

次にクラスBの場合:

- (void)littleBFunction {
    NSLog(@"classB little function");
}

// somewhere else in the class
[ClassA theBigFunction:@selector(littleBFunction) fromObject:self]

次にクラスCの場合:

- (void)littleCFunction {
    NSLog(@"classC little function");
}

// somewhere else in the class
[ClassA theBigFunction:@selector(littleCFunction) fromObject:self]

編集:送信されたセレクターを修正(セミコロンを削除)

7
MJD
5
ARC