iOSパラメータはblockと関数を渡します
1328 ワード
iOS開発をしている学生は、コールバックをするときは、エージェントやblockを使うことが多いことを知っています.本稿ではエージェントではなく、blockだけを話しています.
これは、blockをパラメータとしてocに渡す方法でblockを実行するのが一般的です.
それはC言語を関数のパラメータとして伝えることができるのではないでしょうか.答えはいいです.
C言語をパラメータとして扱うのも,エージェントを用いたくないためであり,メソッド体が扱う論理が短くない解決策の一つである.
また、別名でOCブロックを定義する際には、次のような方法が用いられる.
では、C言語の関数を別名で定義するにはどうすればいいのでしょうか.
2つの定義は本当に似ていて、1つの
使うときは普通のタイプとすればいいです.
これだけメモをとる.
// OC
-(void)testOCBlock {
//...
[self callOCBlock:^(NSInteger num) {
NSLog(@"---%ld", (long)num);
}];
}
// OC
-(void)callOCBlock:(typeof(void(^)(NSInteger)))ocblock {
//...
ocblock(20);
}
これは、blockをパラメータとしてocに渡す方法でblockを実行するのが一般的です.
それはC言語を関数のパラメータとして伝えることができるのではないでしょうか.答えはいいです.
// C
-(void)testCFun {
//...
[self callCFun:cfun];
}
//
void cfun(NSInteger num) {
NSLog(@"---%ld", (long)num);
}
// C
-(void)callCFun:(typeof(void(*)(NSInteger)))cfun {
//...
cfun(20);
}
C言語をパラメータとして扱うのも,エージェントを用いたくないためであり,メソッド体が扱う論理が短くない解決策の一つである.
また、別名でOCブロックを定義する際には、次のような方法が用いられる.
// OC Block
typedef void(^OCBlock)(NSInteger num);
では、C言語の関数を別名で定義するにはどうすればいいのでしょうか.
// C
typedef void(*CFun)(NSInteger num);
//typedef void*CFun(NSInteger num);//
2つの定義は本当に似ていて、1つの
^
と*
の違いしか見えません.使うときは普通のタイプとすればいいです.
// C
typedef void(*CFun)(NSInteger num);
// OC Block
typedef void(^OCBlock)(NSInteger num);
-(void)doCFun:(CFun)cfun {
cfun(10);
}
-(void)doBlock:(OCBlock)block {
block(10);
}
これだけメモをとる.