[英]Error adding methods to a class that conform to NSComparisonMethods protocol
我需要通过添加一些符合NSComparisonMethods协议的方法来扩展Fraction类。
这是我的代码: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
知道是什么..方法实现中的问题是什么? 我不能测试这样的对象(selfCopy == object)
吗? 我应该做selfCopy.numerator
(exedra ..)
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;如果接收方和对象相等,则应返回NSOrderedSame。 例如,NSString没有实现此非正式协议中声明的大多数方法,但是NSString对象仍然可以正确处理符合该协议的消息,因为NSString实现了满足必要要求的compare:方法。 可可还包括NSDate,NSDecimalNumber和NSValue类的适当的compare:方法实现。
所以你最好有一个-compare:
like
-(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;
}
if (selfCopy == object)
始终为false,因为您正在比较指针。
您必须对实例进行适当的比较。
我不能测试这样的对象(selfCopy == object)吗? 我应该做selfCopy.numerator
不。您不需要self
的副本。 同样,您甚至没有创建self
的副本,而只是分配了一个新对象。 这就是它的外观。
-(BOOL)isEqualTo:(id)object
{
if (self.someValue == object.someValue &&
self.otherValue == object.otherValue)
return YES;
else
return NO;
}
我的版本:
-(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]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.