我正在使用Xcode为iPhone制作应用程序,我认为Xcode搞砸了我......
我在ViewController.h
:
@property (weak, nonatomic) IBOutlet UITextField *passwordField;
@property (weak, nonatomic) IBOutlet UILabel *passwordResult;
- (IBAction)go:(id)sender;
和ViewController.m
:
- (void)viewDidLoad {
A = @"A";
}
- (IBAction)go:(id)sender {
password = [NSString stringWithFormat:@"%@", _passwordField.text];
if (password == A) {
_passwordResult.text = [NSString stringWithFormat:@"%@", A];
}
}
如果输入是大写'A',这应该在我的标签上打印大写字母'A',对吗? 如果没有,我该怎么做?
注意:我不想只是复制输入的短语并打印出来,我想制作一个密码破解程序应用程序,看看它是否有效......
答案 0 :(得分:0)
而不是:
if (password == A)
使用
if ([password isEqualToString:A])
否则,您只是比较指针,而不是字符串本身的内容。
答案 1 :(得分:0)
对于字符串比较,请使用[someString isEqualToString:anotherString]
使用==
将比较两个指针是否指向同一个对象,而不是它们指向具有相同内容的对象。即使两个指针都包含相同的字符串,也不意味着它们指向同一个对象。
如果两个人都有同一辆车,并且有相同的钥匙来解锁它,两个钥匙都不相同,不会打开两辆车;每个人只会打开制作它的汽车。如果一个人有车但是有一把额外的钥匙,他们是相同的,因为他们打开同一辆车(物体)。你可以用这种方式思考指针。
答案 2 :(得分:0)
正如Rickay和trudyscousin指出的那样,您对平等的测试应该是isEqualToString
而不是==
。
并且 - 正如CodaFi和dreamlax暗示的那样,这一行:
_passwordResult.text = [NSString stringWithFormat:@"%@", A];
包含一些冗余,因为A和_passwordResult.text都是NSStrings,因此您不需要创建中间NSString:
_passwordResult.text = A;
就足够了。
其他一些风格观察......
你可能已经在某个地方声明了你的iVar“A”。我建议您使用属性声明,就像您为IBOutlets所做的那样,并且还给它一个更好的名字。
@property (nonatomic, strong) NSString* aBetterNamedA
您甚至应该在对象中使用访问器语法:
self.aBetterNamedA
self.passwordResult.txt
(唯一的例外情况应该是您的init
和dealloc
方法,这些方法应直接针对iVar。