分类。变量的可见性

时间:2012-04-17 15:12:06

标签: objective-c categories

我正在研究一个包含类别的简单Objective-c程序。我的班.h:

#import <Foundation/Foundation.h>

@interface Fraction : NSObject

@property int numerator, denominator;

-(void)setNumerator:(int)n andDenominator:(int)d;

@end

在.m文件中,我合成了numeratordenominator。在我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

但我的计划在类别的实施部分中没有看到numeratordenominator。错误“使用未声明的标识符'分子'(分母相同)。我做错了什么?

1 个答案:

答案 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