【问题标题】:Undeclared identifier Objective C未声明的标识符目标 C
【发布时间】:2012-11-13 08:08:07
【问题描述】:

我似乎无法绕过这个错误;使用未声明的标识符“ageBy”。 我不明白为什么会得到它,因为我的代码中有 import Person.h。 感谢您的时间和任何帮助。

人.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

人.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

【问题讨论】:

  • 如果这段代码通过声明一些属性而不是 ivars 和方法,你可以消除 80%。

标签: iphone objective-c ios xcode ios4


【解决方案1】:

您的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 以创建正确的输出.

【讨论】:

  • @ukbaz 将summaryString 方法重命名为description 的另一个好处是可以轻松记录Person 对象:NSLog(@"Person: %@", somePersonObject);。无需调用description 或您的summaryString 方法。
【解决方案2】:

如前所述,问题是由嵌入在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

【讨论】:

  • 我将成为 Pedantic 先生,以便为原始海报提供一个关于 @propertys 的额外事实:而 copy 对于任何可以是可变的,发布的原始代码的技术等价物将是strong,因为他目前没有复制属性。
  • @Tommy 很高兴您指出了这一点。我应该更清楚的是,我对copy 的使用应该被视为一种改进,而不是对原始语义的完全替代。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多