2013-02-20 65 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]); 
}