2016-07-05 7 views
2

Ich bin sehr neu in Objective-C (und Programmierung im Allgemeinen ... Ich habe nur Python und ein wenig HTML studiert). Ich versuche, aus dem Tutorial here zu lernen, aber ich renne in einen Fehler, den ich nicht scheinen kann, herausgefunden zu bekommen.Objective-C Kein Getter Methodenfehler

In Fraction.m, unter - (void) add: (Fraktion *) newFraction Ich bekomme den Fehler "Keine Getter-Methode für das Lesen von Eigenschaft" auf den nächsten zwei Zeilen.

Wenn mir jemand helfen könnte, wäre das toll! Irgendwelche Vorschläge werden geschätzt.

Danke, Adam

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

Würde vorschlagen, wenn Sie python wissen gehen für swift einfach zu lernen –

+0

Können Sie versuchen, Zähler und Nenner als Eigenschaften zu erklären? @Eigenschaft (nichtatomisch) NSInteger-Zähler, Nenner; – Arun

+0

Das Tutorial ist 5 Jahre alt. Das ist eine Ära in Bezug auf Software-Lebenszyklen. Suchen Sie nach einem modernen Lernprogramm mit realen Eigenschaften, die implizite Setter und Getter bereitstellen. – vadian

Antwort

3

Es gibt zwei mögliche Lösungen

Lösung 1

Ändern Sie alle self.numerator-numerator und alle self.denominator zu denominator

Lösung 2

Deklarieren numerator und denominator als Eigenschaften

@property(nonatomic) NSInteger numerator, denominator; 

Nun sind alle numerator-self.numerator und alle denominator zu self.denominator

ändern Was ich vorschlagen, ist Lösung 2

Erklärung

Grund, warum Sie den Fehler wurden immer war, in Ihrem ursprünglichen Code numerato r und Nenner waren Klassenvariablen. So können Sie auf sie mit dem gleichen Namen zugreifen, ohne self. zu verwenden. Der Fehler wurde in der Zeile ausgelöst, in der Sie self.numerator verwendet haben.

Ein negativer Punkt von Lösung 1 ist, dass Sie für diese Variablen eigene Setter- und Getter-Methoden hinzufügen müssen. In Lösung 2 erstellt das Betriebssystem jedoch nur Setter- und Getter-Methoden, indem es sie als Eigenschaften deklariert. Sie müssen nur auf die Variablen zugreifen, indem Sie self. verwenden.

Nachdem sie als Eigenschaften normal erklärt numerator arbeiten nicht. Sie müssen self.numerator verwenden. Dies ist der Grund, warum Sie wieder einen Fehler bekommen haben. Wie bereits erwähnt, müssen Sie, wenn Sie sie als Eigenschaften deklarieren, keine Getter- und Setter-Methoden hinzufügen, da das Betriebssystem sie selbst erstellt.So können Sie einfach entfernen setNumerator und setDenominator Methoden

+0

@Adam überprüfen Sie meine aktualisierte Antwort. Happy Coding :) – Arun

+0

Vielen Dank! –

Verwandte Themen