ブロックの宣言と作成 翻訳元
以下のセクションでは実践的な例を使ってブロックを始める手助けをします。
このページの最終更新:2010-03-04
ADCの最終更新:2009-10-19
ADCの最終更新:2009-10-19
目次
ブロック参照の宣言
ブロック変数はブロックへの参照を持ちます。ブロック変数は関数ポインタを宣言するのとよく似た構文を使います。違っているのは*の代わりに^を使うことだけです。ブロック型は他のCの型系を完全に組み込んで動作します。以下は全て有効なブロック変数の宣言です。
void (^blockReturningVoidWithVoidArgument)(void); int (^blockReturningIntWithIntAndCharArguments)(int, char); void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int); |
ブロックは可変長引数(...)をサポートしています。引数をとらないブロックは引数リストにvoidを指定しなければなりません。
ブロックはコンパイラにブロックの機能を有効にする為の全てのメタデータの集合や渡される引数、戻り値の指定を渡すことで完全に安全な型になるように設計されています。ブロックの参照は任意のポインタ型にキャストできますし、その逆も同様です。ただし、間接参照演算子(*)経由でブロックの参照を得ることはできません。なぜなら、コンパイル時にブロックのサイズが計算できなくなってしまうからです。
また、ブロックの型を作成することができます。一般的にはそうすることが複数の箇所でシグニチャとしてブロックを使用する時に実用的だと考えられています。
ブロックはコンパイラにブロックの機能を有効にする為の全てのメタデータの集合や渡される引数、戻り値の指定を渡すことで完全に安全な型になるように設計されています。ブロックの参照は任意のポインタ型にキャストできますし、その逆も同様です。ただし、間接参照演算子(*)経由でブロックの参照を得ることはできません。なぜなら、コンパイル時にブロックのサイズが計算できなくなってしまうからです。
また、ブロックの型を作成することができます。一般的にはそうすることが複数の箇所でシグニチャとしてブロックを使用する時に実用的だと考えられています。
typedef float (^MyBlockType)(float, float); MyBlockType myFirstBlock = // ... ; MyBlockType mySecondBlock = // ... ; |
ブロックの生成(Creating a Block)
ブロックのリテラル表現の始まりを明示するには^演算子を、終わりを明示するには;演算子を使用します。以下の例では簡単なブロックを宣言し、あらかじめ宣言しておいた変数(oneFrom)で参照しています。
int (^oneFrom)(int); oneFrom = ^(int anInt) { return anInt - 1; }; |
ブロック表現の戻り値を明確に宣言しなければ、ブロックの内容から自動的に推定されます。戻り値の型が推定される場合で引数リストがvoidであれば、戻り値と同様(void)引数を省略することができます。複数return文がある場合、その型は正確に一致していなければなりません(必要ならキャストを使います)。
大域ブロック(Global Blocks)
ファイルレベルでブロックを大域的なリテラルとして使用できます。
#import <stdio.h> int GlobalInt = 0; int (^getGlobalInt)(void) = ^{ return GlobalInt; }; |