2013-02-20 68 views
0

我需要通過添加符合NSComparisonMethods協議的幾個方法來擴展Fraction類。將方法添加到符合NSComparisonMethods協議的類時出錯

這是我的代碼: Fraction.h

#import <Foundation/Foundation.h> 

@protocol NSComparisonMethods 

-(BOOL) isEqualTo:(id)object; 
-(BOOL) isLessThanOrEqualTo:(id)object; 
-(BOOL) isLessThan:(id)object; 
-(BOOL) isGreaterThan:(id)object; 
-(BOOL) isGreaterThanOrEqualTo:(id)object; 
-(BOOL) isNotEqualTo:(id)object; 

@end 

@interface Fraction : NSObject <NSComparisonMethods> 

@property int numerator, denumerator; 

-(void) print: (BOOL) test; 
-(void) setTo: (int) n over: (int) d; 
-(double) convertToNum; 
-(void) reduce; 
-(id) addFrac:(id)f; 
-(void) justPrint; 
-(id) initWith:(int)n over:(int)f; 
+(Fraction *) allocF; 
+(int) count; 
+(int) gCounter; 

@end 

Fraction.m

#import "Fraction.h" 

@implementation Fraction 

@synthesize numerator, denumerator; 

-(BOOL) isEqualTo:(id)object 
{ 
    Fraction *selfCopy = [[Fraction alloc] init]; 

    if (selfCopy == object) 
     return YES; 
    else 
     return NO; 
} 
//more methods.. 

的main.m

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

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

    @autoreleasepool { 

     Fraction *fracA = [[Fraction alloc] init]; 
     Fraction *fracB = [[Fraction alloc] init]; 

     id Object; 

     [fracA setTo:1 over:4]; 
     [fracB setTo:1 over:4]; 

     Object = fracB; 

     NSLog(@"%s",[fracA isEqualTo: Object]? "Yes":"No"); 
    } 

    return 0; 
} 

是不是它想正常工作?我得到No沒有metter什麼.. 是在方法實施中的問題?不能我測試這樣的對象(selfCopy == object)?我應該做selfCopy.numerator(exedra ..)

回答

3
if (selfCopy == object) 

這只是檢查,如果指針是一樣的

嘗試

-(BOOL) isEqualTo:(id)object 
{ 
    return self.numerator == object.numerator && self.denumerator == object.denumerator : 
} 

好吧,這是太簡單了,因爲[fracA setTo:1 over:4][fracA setTo:2 over:8]大概應該是平等的,但你應該明白這一點。


提供了用於許多的這些方法通過NSObject的默認的實現適合於實現單個比較方法,其選擇器,簽名對象,描述符合下列:

- (NSComparisonResult)compare:(id)object; 

如果接收方小於對象,則此方法應返回NSOrderedAscending,如果接收方大於對象,則此方法應返回 NSOrderedDescending,並且 NSOrdered如果接收者和對象相等,則同名。例如, NSString不實現此非正式協議中聲明的大多數方法,但NSString對象仍處理符合此協議的消息 ,因爲NSString實現了 compare:方法以滿足必要的要求。可可也 包括適當的比較:NSDate, NSDecimalNumber和NSValue類的方法實現。

所以你最好有一個-compare:

-(NSOrderResult) compare:(Fraction *)otherFraction 
{ 
    Fraction *selfReduced = [self fractionReduced]; // should return a unretaind reduced copy 
    Fraction *otherReduced= [otherFraction fractionReduced]; 
    float selfAbs = (float)selfReduced.nominator/(float)selfReduced.denominator; 
    float otherAbs = (float)selfReduced.nominator/(float)selfReduced.denominator; 
    if (selfAbs > otherAbs) return NSOrderedAscending; 
    if (selfAbs > otherAbs) return NSOrderedDescending; 
    return NSOrderedSame; 
} 
+0

明白了..謝謝:) – MNY 2013-02-20 01:04:31

+0

你是什麼意思關於「你不需要重新聲明NSComparisonMethods」?@vikingosegundo – MNY 2013-02-20 01:06:56

+0

這是他們申明的唯一地方.. @ vikingosegundo – MNY 2013-02-20 01:09:13

2

if (selfCopy == object)將永遠是錯誤的,因爲你在比較指針。

您必須對您的實例進行適當的比較。

不能我這樣的測試對象(selfCopy ==對象)?我應該做selfCopy.numerator

不需要self副本。此外,你甚至沒有創建self的副本,你只是分配一個新的對象。這應該是這樣的。

-(BOOL)isEqualTo:(id)object 
{ 
    if (self.someValue == object.someValue && 
     self.otherValue == object.otherValue) 
     return YES; 
    else 
     return NO; 
} 
+0

謝謝塞巴斯蒂安! @Sebastian – MNY 2013-02-20 01:05:35

+0

你可以直接寫'return(self.someValue == object.someValue && self.otherValue == object.otherValue);'。 – iDev 2013-02-20 01:27:01

+0

當然,我只是不想改變原來的代碼太多。 – Sebastian 2013-02-20 02:47:07

0

我的版本:

-(BOOL) isEqualTo: (Fraction *) f 
{ 
Fraction *temp1 = [[Fraction alloc] init]; 
Fraction *temp2 = [[Fraction alloc] init]; 
[temp1 setTo:[self numerator] over:[self denominator]]; 
[temp2 setTo:[f numerator] over:[f denominator]]; 
[temp1 reduce]; 
[temp2 reduce]; 

return ([temp1 numerator] == [temp2 numerator]) 
     && ([temp1 denominator] == [temp2 denominator]); 
}