我正在研究一个包含类别的简单Objective-c程序。我的班.h:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int numerator, denominator;
-(void)setNumerator:(int)n andDenominator:(int)d;
@end
在.m文件中,我合成了numerator
和denominator
。在我main.m
类的Fraction
创建的类别中:
#import "Fraction.h"
@interface Fraction (MathOps)
-(Fraction *) add: (Fraction *) f;
@end
@implementation Fraction (MathOps)
-(Fraction *) add: (Fraction *) f
{
// To add two fractions:
// a/b + c/d = ((a*d) + (b*c)) / (b * d)
Fraction *result = [[Fraction alloc] init];
result.numerator = (numerator * f.denominator) +
(denominator * f.numerator);
result.denominator = denominator * f.denominator;
[result reduce];
return result;
}
@end
但我的计划在类别的实施部分中没有看到numerator
和denominator
。错误“使用未声明的标识符'分子'(分母相同)。我做错了什么?
答案 0 :(得分:5)
使用属性而不是直接使用ivars:
result.numerator = (self.numerator * f.denominator) + (self.denominator * f.numerator);
result.denominator = self.denominator * f.denominator;
实例变量对您的类别不可见,因为它们未在Fraction的界面中声明 - 它们仅在您在实现中@synthesize它们时创建。这导致了另一种可能的解决方案,即在Fraction的接口中声明实例变量:
@interface Fraction : NSObject {
int numerator;
int denominator;
}
@property int numerator, denominator;
-(void)setNumerator:(int)n andDenominator:(int)d;
@end