分类.变量的可见性

Rom*_*use 2 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
Run Code Online (Sandbox Code Playgroud)

在.m文件中我合成了我的numeratordenominator.在main.mFraction班级的创建类别中:

#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
Run Code Online (Sandbox Code Playgroud)

但我的程序没有看到numeratordenominator类别的实现部分.错误"使用未声明的标识符'分子'(分母相同).我做错了什么?

Cal*_*leb 5

使用属性而不是直接使用ivars:

result.numerator = (self.numerator * f.denominator) + (self.denominator * f.numerator);
result.denominator = self.denominator * f.denominator;
Run Code Online (Sandbox Code Playgroud)

实例变量对于您的类别是不可见的,因为它们未在Fraction的界面中声明 - 它们仅在您在实现中@synthesize它们时创建.这导致了另一种可能的解决方案,即在Fraction的接口中声明实例变量:

@interface Fraction : NSObject {
    int numerator;
    int denominator;
}

@property int numerator, denominator;

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

@end
Run Code Online (Sandbox Code Playgroud)