我对Objective c非常新,当我遇到困境时,我会慢慢学习谷歌等,但我已经被困了几个小时。 我做了一个基本测验,答案是数字。 我有2个数组问题和答案我得到数组索引在一起,NSlog显示他们是正确的但我的代码只是不同意选择正确的答案。 即使你说它的权利,答案总是错误的。 谢谢你的帮助
_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];
}
}
答案 0 :(得分: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
现在将内存地址保存到Obj-C对象,该对象保存字符串“Hello”的每个字符。如果您使用NSLog(@"%p",str1)
进行打印,则可能会显示十六进制地址,例如0xC35AF3
。
话虽如此,上述代码无效,只是因为==
没有比较变量的真实内容,而是地址他们,因为那是str1
所持有的,一个依赖于体系结构的地址指针。从这个意义上讲,运算符==
只会检查字符串是否完全相同,因为它们都指向内存中的相同字符串。
您的代码正在执行类似的操作,但只有Obj-C字符串存储在数组中,您只需使用用户的输入进行检查。
在这种情况下,使用方法[stringA isEqualToString:stringB]
,此方法在Obj-C字符串中逐个字符地检查。
我建议你在使用ObjC之前牢牢掌握C编程的基本原理,因为你将比你想象的更多地处理它们,特别是如果你来自一个被解释的不认为 - 关于记忆的语言。查看K&amp; R C和手册页。
答案 1 :(得分:0)
不要使用“==”。使用isEqualToString :. “==”正在测试地址的相等性,而不是对象本身。两个NSStrings没有相同的地址,因为它们是具有相同值的不同NSStrings(一个是您的正确答案,另一个是用户提交的答案)。
答案 2 :(得分: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];
}