我是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
答案 0 :(得分:3)
有两种可能的解决方案
解决方案1
将所有self.numerator
更改为numerator
,将所有self.denominator
更改为denominator
解决方案2
将numerator
和denominator
声明为属性
@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方法,因为操作系统本身正在创建它们。因此,您只需删除setNumerator
和setDenominator
方法