我有下面的代码,只需读取一堆卡片,如果事先不存在,就将其名称输入Mutable Array。
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSMutableArray *allCards = [[NSMutableArray alloc] init];
char cardAvailable = '\0';
do {
Card *newCard = [[Card alloc] init];
NSLog(@"What is the Card Name ?\n");
char cName[20];
scanf("%s",cName);
NSString *nName = [NSString stringWithCString:cName encoding:1];
[newCard setName:nName];
if([newCard wasMatch:allCards]) {
NSLog(@"Card Already Present");
} else {
NSLog(@" NEW CARD NAME %@ %@ %s",[newCard getName],newCard.name, cName);
[newCard addGlobal:newCard toArray:allCards];
}
NSLog(@"Is there another Card to Input?");
scanf("%c",&cardAvailable);
} while(cardAvailable != 'N' || cardAvailable != 'n');
NSLog(@":::: Card Names Are ::::");
for(Card *card in allCards)
{
NSLog(@"%@",card.name);
}
}
return 0;
}
然而,首先 - 这个名字根本就没有设定。我不知道为什么会这样。今天是Objective C的第一天,所以请原谅我,如果这太简单了。
卡类文件是 -
#import <Foundation/Foundation.h>
@interface Card : NSObject
@property(nonatomic) BOOL chosen;
@property (nonatomic, getter = getName) NSString *name;
-(BOOL)wasMatch:(NSMutableArray*) allCards;
-(void)addGlobal:(Card*) aCardName toArray:(NSMutableArray*) allCards;
-(void)setName:(NSString *)name;
-(void)setChosen:(BOOL)chosen;
@end
我在这里得到错误 - 在添加全局行中。
#import "Card.h"
@implementation Card
@synthesize chosen = _chosen;
-(BOOL)chosen
{
return _chosen;
}
-(void)setChosen:(BOOL)chosen
{
_chosen = chosen;
}
@synthesize name = _name;
-(NSString*)getName
{
return _name;
}
-(void)setName:(NSString*)name
{
name = _name;
}
-(BOOL)wasMatch:(NSMutableArray *)allCards
{
for(Card *card in allCards)
{
if([self.name isEqualToString:card.name])
{
return true;
}
}
return false;
}
-(void)addGlobal:(Card *)aCardName toArray:(NSMutableArray *)allCards
{ NSLog(@" THE NS STRING %@",aCardName.name);
[allCards addObject:aCardName.name];
}
@end
答案 0 :(得分:1)
你的二传手是错的。
-(void)setName:(NSString*)name
{
name = _name;
}
将当前实例变量(_name)分配给参数。
这应该是另一种方式。
-(void)setName:(NSString*)name
{
_name = name;
}
但你根本不需要这个。您的代码存在各种问题。
@property (nonatomic, getter = getName) NSString *name;
应该是
@property (copy, nonatomic) NSString *name;
除非你在古老版本的Objective-C中编写代码(你不应该这样做),否则你不需要显式的getter和setter。在最近的版本中,您甚至不必明确合成 在较新版本的Objective-C中,您的Card类看起来应该更像这样:
@interface Card : NSObject
@property (assign, nonatomic) BOOL chosen;
@property (copy, nonatomic) NSString *name;
-(BOOL)wasMatch:(NSMutableArray*) allCards;
-(void)addGlobal:(Card*) aCardName toArray:(NSMutableArray*) allCards;
@end
#import "Card.h"
@implementation Card
-(BOOL)wasMatch:(NSMutableArray *)allCards
{
for(Card *card in allCards)
{
if([self.name isEqualToString:card.name])
{
return YES;
}
}
return NO;
}
-(void)addGlobal:(Card *)aCardName toArray:(NSMutableArray *)allCards
{ NSLog(@" THE NS STRING %@",aCardName.name);
[allCards addObject:aCardName.name];
}
@end
方式更少的代码。您可能希望寻找更新的学习资源。
其余代码看起来也有问题。老实说,我没有在addGlobal:toArray:
中看到这一点。但我不想让这个答案超过必要的时间。 ; - )
另外,为了爱你未来的自我,不要在NSString *nName = [NSString stringWithCString:cName encoding:1];
中使用1来使用常数。在您的情况下NSASCIIStringEncoding
。但是因为它不再是1980年,你很可能想要使用NSUTF8StringEncoding
而不是ASCII。
正如我所说,请获取更多近期和体面的学习资源。
答案 1 :(得分:0)
在-setName:
属性访问器方法中,将_name
实例变量值分配给name
参数。它应该像这样交换:
-(void)setName:(NSString*)name
{
_name = name;
}
答案 2 :(得分:0)
要学习Objective-C,我将重新评论Paul Hegarty最近的斯坦福大学讲座。 CS193p该类被调用。你可以在iTunes U上找到所有材料和优秀视频。除了Apple资源之外,没有比这更好的了。