将方法添加到符合NSComparisonMethods协议的类时出错 [英] Error adding methods to a class that conform to NSComparisonMethods protocol

查看:113
本文介绍了将方法添加到符合NSComparisonMethods协议的类时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要通过添加几个符合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

  #importFraction.h

@implementation Fraction

@synthesize numerator,denumerator;

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

if(selfCopy == object)
return YES;
else
return NO;
}
//更多方法..

main.m

  #import< Foundation / Foundation.h> 
#importFraction.h
#importFraction + MathOperations.h

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

@autoreleasepool {

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

id对象;

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

Object = fracB;

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

return 0;
}

这不是假设正常工作吗?我得到没有没有metter什么..
方法实现中的问题?我可以测试对象像这样(selfCopy == object)?应该我 selfCopy.numerator (exedra ..)

解决方案

p> if(selfCopy == object)

指针是相同的



try

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

好吧,这太简单了, [fracA setTo:1 over:4] [fracA setTo:2 over:8] ,但你应该得到点。







许多这些方法的默认实现by NSObject适用于实现其选择符,签名和描述匹配以下内容的单个比较方法的对象:


   - (NSComparisonResult)compare:(id)object; 




此方法应返回NSOrderedAscending如果接收器小于object,
NSOrderedDescending如果接收器大于对象,
NSOrderedSame如果接收器和对象相等。例如,
NSString不实现在这个
非正式协议中声明的大多数方法,但NSString对象仍然正确处理符合此协议的消息
,因为NSString实现了
比较:方法满足必要的要求。 Cocoa也
包括NSDate,
NSDecimalNumber和NSValue类的适当的compare:方法实现。


你最好有一个 -compare: like

   - (NSOrderResult)比较:(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)返回NSOrderedDescending;
return NSOrderedSame;
}


I need to extend a Fraction class by adding couple of methods that conform to NSComparisonMethods protocol.

This is my code: 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;
}

Isn't it suppose to work properly? Im getting No no metter what.. Is the problem in the method implementation? cant I test object like this (selfCopy == object)? should I do selfCopy.numerator (exedra..)

解决方案

if (selfCopy == object) 

this only checks, if the pointer is the same

try

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

Okay, this is too simple, as [fracA setTo:1 over:4] and [fracA setTo:2 over:8] should probably be equal, but you should get the point.


The default implementation provided for many of these methods by NSObject is appropriate for objects that implement a single comparison method whose selector, signature, and description match the following:

- (NSComparisonResult)compare:(id)object;

This method should return NSOrderedAscending if the receiver is less than object, NSOrderedDescending if the receiver is greater than object, and NSOrderedSame if the receiver and object are equal. For example, NSString does not implement most of the methods declared in this informal protocol, but NSString objects still handle messages conforming to this protocol properly because NSString implements a compare: method that meets the necessary requirements. Cocoa also includes appropriate compare: method implementations for the NSDate, NSDecimalNumber, and NSValue classes.

So you should better have a -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;
}

这篇关于将方法添加到符合NSComparisonMethods协议的类时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆