2016-07-05 3 views
2

Я очень новичок в Objective-C (и программировании вообще ... Я изучал только Python и немного HTML). Я пытаюсь извлечь уроки из учебника here, но я столкнулся с ошибкой, которую я не могу понять.Objective-C Ошибка метода getter

In Fraction.m, under - (void) add: (Fraction *) newFraction Я получаю сообщение об ошибке «Без метода getter для чтения из свойства» на следующих двух строках.

Если бы кто-нибудь мог мне помочь, это было бы здорово! Любые предложения приветствуются.

Спасибо, Адам

КОД:

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

Предлагает, если вы знаете, что python подходит для быстрого изучения. –

+0

Можете ли вы попробовать объявить числитель и знаменатель как свойства? @property (неатомный) NSInteger числитель, знаменатель; – Arun

+0

Урок 5 лет. Это эпоха с точки зрения жизненных циклов программного обеспечения. Найдите современный учебник с использованием реальных свойств, предоставляющих неявные сеттеры и геттеры. – vadian

ответ

3

Есть два возможных решения

Решение 1

Изменить все self.numerator к numerator и все self.denominator к denominator

Решение 2

Объявить numerator и denominator как свойства

@property(nonatomic) NSInteger numerator, denominator; 

Теперь изменить все numerator к self.numerator и все denominator к self.denominator

Что я предлагаю решение 2

Объяснение

Причина, почему вы получаете сообщение об ошибке был, в вашем исходном коде числото r и знаменатель были переменными класса. Таким образом, вы можете получить к ним одно имя без использования self.. Ошибка была выбрана в строке, где вы использовали self.numerator.

Одна отрицательная точка решения 1 заключается в том, что для этих переменных необходимо добавить собственные методы настройки и получения. Но в решении 2, объявив их как свойства, ОС будет создавать только методы setter и getter. Единственное, что вам нужно сделать, это получить доступ к переменным, используя self..

После объявления их как свойств нормальный numerator не работает. Вы должны использовать self.numerator. Именно по этой причине вы снова получили ошибку. Как я уже сказал, если вы объявляете их как свойства, вам не нужно добавлять методы getter и setter, поскольку сама ОС их создает.Таким образом, вы можете просто удалить setNumerator и методы

+0

@Adam проверить мой обновленный ответ. Счастливое кодирование :) – Arun

+0

Большое вам спасибо! –

Смежные вопросы