2014-02-12 3 views
0

У меня есть код ниже, который просто читает кучу карточек и вводит их имена в Mutable Array, если они не присутствуют заранее.Почему объект в этом объектном C-коде не задан?

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; 
} 

Однако, во-первых - имя просто НЕ SET. Я не знаю, почему это происходит. Сегодня был мой первый день с 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 

ответ

1

Ваш сеттер ошибочен.

-(void)setName:(NSString*)name 
{ 
    name = _name; 
} 

Назначение текущей переменной экземпляра (_name) параметру.

Это должно быть наоборот.

-(void)setName:(NSString*)name 
{ 
    _name = name; 
} 

Но это вам совсем не нужно. Существуют различные проблемы с вашим кодом.

  • Объектив-C не использует getFoo для обычных геттеров.
    @property (nonatomic, getter = getName) NSString *name; должен быть
    @property (copy, nonatomic) NSString *name;

И если вы не пишете код в древней версии Objective-C (который вы не должны) вам не нужны явные методы получения и установки. В последней версии вам даже не нужно явно синтезировать.
В новой версии Objective-C ваш класс карты должен выглядеть следующим образом:

@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 

Way меньше кода. Возможно, вам захочется найти более современный учебный ресурс.

Остальная часть вашего кода выглядит также сомнительной. Я честно не вижу смысла в addGlobal:toArray:. Но я не хочу доводить этот ответ дольше, чем нужно. ;-)


Кроме того, за любовь ваших будущих себя, не используйте 1 в NSString *nName = [NSString stringWithCString:cName encoding:1]; использовать константу. В вашем случае NSASCIIStringEncoding. Но поскольку это уже не 1980, вы, скорее всего, захотите использовать NSUTF8StringEncoding вместо ASCII.

Как я уже сказал, получите более свежие и достойные учебные ресурсы.

+0

Отличный ответ. Большое спасибо. Любой ресурс, который вы бы рекомендовали? –

0

В методе доступа к объекту -setName: вы присваиваете значение переменной экземпляра _name параметру name. Он должен быть заменен, как это:

-(void)setName:(NSString*)name 
{ 
    _name = name; 
} 
0

Чтобы узнать Objective-C я reccomment самые последние лекции в Стэнфорде Пола Хегарти. CS193p вызывается класс. Вы можете найти все материалы и отличные видео на iTunes U.Другой, чем Apple ресурс, не лучше, чем это.

+0

Это на самом деле то, что он делает на первой лекции. Я думал, что смогу реализовать некоторые из них. –

Смежные вопросы