構文エラーがこのコードのどこにあるのかわからないので、私は盲目になると思います。
if( cell == nil ) {
titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero
reuseIdentifier:CellIdentifier ] autorelease
];
switch( cellNumber ) {
case 1:
NSString *viewDataKey = @"Name";
etc...
コンパイルしようとすると、最終行にError:syntax error before '*' tokenが表示されます。
そのような基本的な質問で申し訳ありませんが、何が欠けていますか?
手元に適切なObjective-Cコンパイラはありませんが、C構造が同一である限り:
switch { … }
はoneブロックレベルのスコープを提供し、case
ごとに1つではありません。スコープの先頭以外の場所で変数を宣言することは不正であり、switch
の内部は特に初期化がジャンプする可能性があるため危険です以上。
次のいずれかで問題は解決しましたか?
NSString *viewDataKey;
switch (cellNumber) {
case 1:
viewDataKey = @"Name";
…
}
switch (cellNumber) {
case 1: {
NSString *viewDataKey = @"Name";
…
}
…
}
ケースステートメントの先頭で変数を宣言することはできません。それだけで構成されるテストケースを作成すると、同じエラーが発生します。
ブロックの途中で宣言されている変数とは関係ありません。GCCがcaseステートメントの最初の宣言を受け入れないようにする標準を採用していてもかまいません。 GCCはケースのラベルを行の一部と見なしているため、そこでの宣言は許可されないようです。
簡単な回避策は、ケースの先頭にセミコロンを置くだけで、宣言が最初にないようにすることです。
Cでは、非宣言ステートメントの前のブロックの先頭でのみ変数を宣言できます。
{
/* you can declare variables here */
/* block statements */
/* You can't declare variables here */
}
C++では、必要な場所で変数を宣言できます。
Switchステートメント内で変数を作成できますが、その変数のスコープが定義されるように、ブロック内で変数を作成する必要があります。
例:
switch(number){
case 1:
{
// Create object here
// object is defined only for the scope of this block
}
break;
case 2:
{
// etc.
}
break;
default:
break;
}
スイッチブロック内で変数を宣言するのは有効ではないのではないでしょうか。
警告を解決する方法:
1. 1つ挿入;
ケースブロックの最初の行
2.中括弧内にコードを置く