2012-11-25 165 views
2

我似乎無法繞過此錯誤;使用未聲明的標識符'ageBy'。 我不明白爲什麼得到它,因爲我有我的代碼中的導入Person.h。 感謝您的時間和任何幫助。未聲明的標識符目標C

Person.h

@interface Person : NSObject 
{ 
int _age; 
int _years; 
NSString *_name; 
NSString *_job; 

} 

-(void)setAge:(int)age; 
-(int)age; 

-(void)setName:(NSString *)name; 
-(NSString *)name; 

-(void)setJob:(NSString *)job; 
-(NSString *)job; 

-(NSString *)summaryString; 

-(void)ageBy:(int)years; 


@end 

Person.m

#import "Person.h" 
@implementation Person 

-(void)setAge:(int)age{ 
    _age = age; 
} 
-(int)age{ 
    return _age; 
} 
-(void)setName:(NSString *)name{ 
    _name = name; 
} 
-(NSString *)name{ 
    return _name; } 

-(void)setJob:(NSString *)job{ 
    _job = job; 
} 
-(NSString *)job{ 
    return _job; 
} 

-(NSString *)summaryString{ 
    return [NSString stringWithFormat:@"The Person %@ is %d years old and is a %@",_name,_age,_job]; 

-(void)ageBy:(int)years{ 
    _years = years; 
    _age = years + _age; 

} 

} 
@end 
+5

你可以通過聲明的幾個屬性而不是實例變量和方法消除了80%,如果這個代碼。 – rmaddy

回答

4

ageBy:在裏面summaryString定義。您可能需要在@end之前移動大括號,以使其大於-(void)ageBy:(int)years。所以:

-(NSString *)summaryString{ 
    return [NSString stringWithFormat:@"The Person %@ is %d years old and is a %@",_name,_age,_job]; 
} 

-(void)ageBy:(int)years{ 
    _years = years; 
    _age = years + _age; 

} 

而且作爲一種風格的注意,如果summaryString僅僅是爲了調試,然後你可能會更好聲明爲description。後者是用於獲取Objective-C對象的實現依賴和字符串描述的標準形式,其實質上像NSArray這樣的集合對象知道要在其所有子對象上調用description以創建正確的輸出。

+2

@ukbaz將'summaryString'方法重命名爲'description'的另一個優點是可以很容易地記錄'Person'對象:'NSLog(@「Person:%@」,somePersonObject);'。沒有必要調用'description'或'''summaryString'方法。 – rmaddy

4

如上所述,該問題是由嵌入在summaryString方法中的ageBy:方法造成的。

我想演示如何類可以利用現代的Objective-C編寫:

// Person.h 
@interface Person : NSObject 

@property (nonatomic, assign) int age; 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) NSString *job; 

- (void)ageBy:(int)years; 

@end 

// Person.m 
@implementation Person 

- (NSString *)description { 
    return [NSString stringWithFormat:@"The Person %@ is %d years old and is a %@", self.name, self.age, self.job]; 
} 

- (void)ageBy:(int)years { 
    self.age = self.age + years; 
} 

@end 
+0

我會成爲Pedantic先生,以便爲原創海報的利益傳授一些關於'@ property's的額外事實:'copy'對任何可變的物體都是一個不錯的選擇,的原始代碼將是'強',因爲他目前沒有複製這些屬性。 – Tommy

+0

@Tommy我很高興你指出。我應該更清楚地認識到,我使用'copy'應該被認爲是一種改進,而不是原來語義的完全替代。謝謝。 – rmaddy