0

私はObjective cに非常に慣れていないので、行き詰まったときにGoogleなどを使用してゆっくりと学習していますが、これで何時間も立ち往生しています。答えが数字である基本的なクイズを作成しています。私は2つの配列の質問と回答を持っています.配列をまとめてインデックスに登録しました.NSlogはそれらが正しいことを示していますが、正しい回答が選択されたときに私のコードは同意しません. あなたのnslogsが正しいと言っていても、答えは常に間違っています。助けてくれてありがとう

_arrayQuestions = [[NSArray alloc] initWithObjects:
                   @"what is johns age?",  
                   @"What is daves age ",   
               nil];


_arrayAnswers = [[NSArray alloc] initWithObjects:
                 @"32",@"42",
                 nil];



- (void)setQuestions {

    currentQuestionIndex++;

    if (currentQuestionIndex == [_arrayQuestions  count]) {
        currentQuestionIndex = 0;
    }

    NSString *question = [_arrayQuestions           objectAtIndex:currentQuestionIndex];

    NSLog(@"displaying question: %@", question); 
    [_questionLabel setText:question];

    // NSLog(@"current answers: %@",[ _arrayAnswers objectAtIndex:currentQuestionIndex]);
}


- (void)checkingAnswers {

    // usersAnswer  = _DateField.text  ;

    answer = [_arrayAnswers objectAtIndex:currentQuestionIndex];

    // int intAnswer = [answer intValue];
    // NSLog(@"answer = : %@", usersAnswer );

    NSLog(@"answer = : %@", _DateField.text);
    NSLog(@"answer = : %@", answer);

    if ( _DateField.text == answer) {

        NSString *rightAnswer = [[NSString alloc] initWithFormat:@"Correct" ];
        [_answerLabel setText : rightAnswer];

    } else {

        NSString *wrongAnswer = [[NSString alloc] initWithFormat:@"Wrong" ];

        if (  [_DateField.text length] ==2 ) {
            [_answerLabel setText : wrongAnswer];
        }
}

- (IBAction)numbersPressed:(UIButton *)sender {

    if ( [_DateField.text length] <=1) {

        NSString *number = sender.currentTitle;
        _DateField.text = [ _DateField.text stringByAppendingString: number];

        [self checkingAnswers];

    }

}
4

3 に答える 3

1

Objective-C のオブジェクトと参照と、古き良き C プリミティブの間には重要な違いがあります。

// C
int a = 2;
if (a == 2)
{
    do_something();
}

前のコードが機能するの==は、変数内に値が含まれていることを演算子がチェックするためですa

一方、次のようにすると、次のようになります。

// Objective-C
NSString *str1 = @"Hello";

if (str1 == @"Hello")
{
    [self doSomething]
}

str1は、文字列 "Hello" の各文字を保持する Obj-C オブジェクトへのメモリ アドレスを保持するようになりました。で印刷するとNSLog(@"%p",str1)、おそらく のような 16 進数のアドレスが表示されます0xC35AF3

そうは言っても、変数==の実際の内容を比較するのではなく、それらのアドレスを比較するという理由だけで、上記のコードは機能しません。これstr1は、アーキテクチャに依存するアドレスポインターを保持しているためです。その意味で、オペレーター==は文字列がまったく同じ文字列であるかどうかのみをチェックします。つまり、両方ともメモリ内の同じ文字列を指しています。

あなたのコードは似たようなことをしていますが、配列に格納されているのは Obj-C 文字列だけであり、ユーザーの入力でそれをチェックしているだけです。

この状況では、メソッドを使用します[stringA isEqualToString:stringB]。このメソッドは、Obj-C 文字列内で文字ごとにチェックします。

ObjC を使用する前に、C プログラミングの基礎をしっかりと理解しておくことをお勧めします。言語。K&R C と man ページを確認してください。

于 2013-07-11T08:10:57.623 に答える
0

おそらく、次のような意味でした:

- (IBAction)numbersPressed:(UIButton *)sender 
{
    _DateField.text = sender.currentTitle;
    [self checkingAnswers];
}

それ以外の

- (IBAction)numbersPressed:(UIButton *)sender {

    if ( [_DateField.text length] <=1) {
        NSString *number = sender.currentTitle;
        _DateField.text = [ _DateField.text stringByAppendingString: number];


        [self checkingAnswers];


    }
于 2013-07-11T08:11:31.897 に答える
0

「==」は使用しないでください。isEqualToString: を使用します。「==」は、オブジェクト自体ではなく、アドレスの等価性をテストしています。2 つの NSString は、同じ値を持つ異なる NSString であるため、同じアドレスを持っていません (1 つはあなたの正解で、もう 1 つはユーザーが送信した回答です)。

于 2013-07-11T07:58:24.053 に答える