Objective-C没有getter方法错误

时间:2016-07-05 17:56:10

标签: ios objective-c xcode

我是Objective-C的新手(一般编程......我只研究过Python和一点点HTML)。我正在尝试从教程 here 中学习,但我遇到了一个我似乎无法理解的错误。

在Fraction.m中,在 - (void)下添加:(分数*)newFraction我得到错误"没有getter方法从属性"在接下来的两行。

如果有人能帮助我,那就太棒了!任何建议都表示赞赏。

谢谢, 亚当

CODE:

FractionDemo.m

#import "Fraction.h"
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
@autoreleasepool {

    Fraction *aFraction = [[Fraction alloc] init];
    Fraction *bFraction = [[Fraction alloc] init];

    [aFraction setNumerator:1 overDenominator:2];
    [bFraction setNumerator:1 overDenominator:3];

    [aFraction display]; NSLog(@" + "); [bFraction display]; NSLog(@" = ");
    [aFraction add:bFraction];
    [aFraction display];

}
return 0;
}

Fraction.h

#import <Foundation/Foundation.h>

@interface Fraction : NSObject {
NSInteger numerator;
NSInteger denominator;
}
- (void)setNumerator:(NSInteger)value;
- (void)setDenominator:(NSInteger)value;
- (void)display;
- (void)setNumerator:(NSInteger)num overDenominator:(NSInteger)denom;
- (void)add:(Fraction *)newFraction;

@end

Fraction.m

#import "Fraction.h"

@implementation Fraction
- (void)setNumerator:(NSInteger)value {
numerator = value;
}

- (void)setDenominator:(NSInteger)value {
denominator = value;
}

- (void)display {
NSString *numeratorString = [[NSString alloc] initWithFormat:@"%ld", (long)numerator];
NSString *denominatorString = [[NSString alloc] initWithFormat:@"%ld", (long)denominator];
NSLog(@"%@/%@", numeratorString, denominatorString);
}

- (void)setNumerator:(NSInteger)num overDenominator:(NSInteger)denom {
self.numerator = num;
self.denominator = denom;
}

- (void)add:(Fraction *)newFraction {
// a/b + c/d = ((a * d) + (b * c)) / (b * d)
self.numerator = self.numerator * newFraction.denominator + self.denominator * newFraction.numerator;
self.denominator = self.denominator * newFraction.denominator;
}

@end

1 个答案:

答案 0 :(得分:3)

有两种可能的解决方案

解决方案1 ​​

将所有self.numerator更改为numerator,将所有self.denominator更改为denominator

解决方案2

numeratordenominator声明为属性

@property(nonatomic) NSInteger numerator, denominator;

现在将所有numerator更改为self.numerator,将所有denominator更改为self.denominator

我建议的是解决方案2

<强>解释

你得到错误的原因是,你的原始代码分子和分母是类变量。因此,您可以使用相同的名称访问它们而不使用self.。错误是在您使用self.numerator的行上抛出的。

解决方案1的一个负面因素是您需要为这些变量添加自己的setter和getter方法。但是在解决方案2中,通过将它们声明为属性,OS将仅创建setter和getter方法。您唯一需要做的就是使用self.访问变量。

将它们声明为正常属性numerator后无法正常工作。您需要使用self.numerator。这就是为什么你再次遇到错误的原因。正如我已经说过的,如果你将它们声明为属性,则不需要添加getter和setter方法,因为操作系统本身正在创建它们。因此,您只需删除setNumeratorsetDenominator方法

即可