0

次のコードをifステートメントからswitchステートメントに変更しようとしましたが、idオブジェクトではなく整数が必要であるというエラーが表示されます。

これが私のスイッチです:

-(void) nearestIndexAfterRotationEnded:(int)index {
NSLog(@"Selected item is: %@", [colorNames objectAtIndex:index]);
statusLabel.text = [NSString stringWithFormat:@"Selected item is: %@", [colorNames objectAtIndex:index]];

switch ([colorNames objectAtIndex:])) {
    case 1:
        [redButton setImage:[UIImage imageNamed:@"Btn1_1.png"] forState:UIControlStateNormal];

        break;

    case 2:
        [redButton setImage:[UIImage imageNamed:@"Btn1_2.png"] forState:UIControlStateNormal];

        break;

    default:
        break;
}

そして、これが私のif条件文です:

-(void) nearestIndexAfterRotationEnded:(int)index {
NSLog(@"Selected item is: %@", [colorNames objectAtIndex:index]);
statusLabel.text = [NSString stringWithFormat:@"Selected item is: %@", [colorNames objectAtIndex:index]];


if ([colorNames objectAtIndex:0]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_1.png"] forState:UIControlStateNormal];

}

if ([colorNames objectAtIndex:1]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_2.png"] forState:UIControlStateNormal];

}

if ([colorNames objectAtIndex:2]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_3.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:3]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_4.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:4]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_5.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:5]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_6.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:6]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_7.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:7]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_8.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:8]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_9.png"] forState:UIControlStateNormal];
}

}

助けてくれてありがとう

4

6 に答える 6

5
- (void)nearestIndexAfterRotationEnded:(int)index {
    NSLog(@"Selected item is: %@", [colorNames objectAtIndex:index]);
    statusLabel.text = [NSString stringWithFormat:@"Selected item is: %@", [colorNames objectAtIndex:index]];

    for (int i=0; i<9; i++) {
        if ([colorNames objectAtIndex:i]) {
            [redButton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Btn1_%d.png", i+1]] forState:UIControlStateNormal];
        }
    }
}
于 2012-08-14T09:32:22.463 に答える
1

さて、私は答えるしかありませんでしたが、ほとんどはすでに言われています。

これは、switchステートメントに変更する元のifステートメントです。

-(void) nearestIndexAfterRotationEnded:(int)index {
NSLog(@"Selected item is: %@", [colorNames objectAtIndex:index]);
statusLabel.text = [NSString stringWithFormat:@"Selected item is: %@", [colorNames objectAtIndex:index]];


if ([colorNames objectAtIndex:0]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_1.png"] forState:UIControlStateNormal];

}

if ([colorNames objectAtIndex:1]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_2.png"] forState:UIControlStateNormal];

}

if ([colorNames objectAtIndex:2]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_3.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:3]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_4.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:4]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_5.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:5]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_6.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:6]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_7.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:7]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_8.png"] forState:UIControlStateNormal];
}

if ([colorNames objectAtIndex:8]) {
    [redButton setImage:[UIImage imageNamed:@"Btn1_9.png"] forState:UIControlStateNormal];
}
}

切り替えるには変数が必要なため、これは不可能です。

さて、すべての答えはわかりません。ifステートメントで行っていることは、渡されたインデックス変数とは何の関係もありません。そこには決して現れません。(これは間違いだと思います)

代わりに、オブジェクトがcolorNames配列のインデックス0〜8に存在するかどうかを0〜8で確認します。ifステートメントのいずれかが失敗した場合、それは次のすべても失敗することを意味します。

if ([colorNames objectAtIndex: i]) 

NILを返します。これは、これが配列の終わりであることを意味します。

したがって、([colorNames objectAtIndex:0-8])が本質的に無意味であるかどうか、または少なくとも単純化が必要かどうかを確認します。このifステートメント全体を1行のコードにまとめることができます。

        [redButton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Btn1_%d.png", colorNames.count]] forState:UIControlStateNormal];

つまり、colorNamesが9個を超えるオブジェクトを保持していない場合です。9つを超えるオブジェクトを保持していて、最初の9つが存在するかどうかだけを確認したい場合は、次の1行のコードでうまくいきます。

[redButton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Btn1_%d.png", MAX(9,colorNames.count)]] forState:UIControlStateNormal]; 

全体として、渡されたインデックス変数が考慮されていないことを忘れないでください。

それが誤っていて、配列内のオブジェクトの名前をインデックスで返したい場合も、複数のifは必要ありません。

if ([colorNames objectAtIndex: index])
 [redButton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"Btn1_%d.png", index+1]] forState:UIControlStateNormal];

したがって、質問を明確にするか(コードスニペットではこれ以上実行できないため)、コードを改善する必要があると思います。

于 2012-08-14T10:09:47.107 に答える
1

スイッチの前提条件を満たしていないため、これをswitchステートメントに変更することはできません。

スイッチは常にパターンに従います

switch aVar {

case value1:
case value2:
default: 

}

switchステートメントの使用を主張する場合は、代替アルゴリズムを見つける必要があります。

于 2012-08-14T09:32:23.623 に答える
1
Change it the code 
 switch ([colorNames objectAtIndex:]))
to 
switch (index)  This will be helpful for you.
于 2012-08-14T09:34:37.273 に答える
0

スイッチでintを使用する必要があります。[colorNames objectAtIndex:1]したがって、整数に変換する必要があります。NSNumberなのかNSStringなのか、色のついたオブジェクトはわかりませんが、最新のものを想定します。

次のように切り替える必要があります。

switch ([[colorNames objectAtIndex:index] intValue]))

intValueメッセージは、NSStringに整数表現を返すように指示します。そうすれば切り替えることができます。

于 2012-08-14T09:33:24.377 に答える
-2

このコードを実行できますか?

switch ([colorNames objectAtIndex:])) {

エラーをスローする必要があります。objectAtIndexに値を渡していない!

そのはず

switch ([colorNames objectAtIndex:index])) {
于 2012-08-14T09:31:33.790 に答える