1

好的,我知道这个主题之前在 SO 上已经提到过很多次,但是在检查了几个这样的问题之后,没有人谈到我在覆盖子类中的基类 getter/setter 时遇到的问题。

我的基类是:

#import <Foundation/Foundation.h>
@interface BaseClass : NSObject
@property (nonatomic, assign) int value;
@end

@implementation BaseClass
@synthesize value;
@end

从那我希望子类充当垫片并将“值”从 int 映射到我的子类中的枚举:

#import <UIKit/UIKit.h>
#import "BaseClass.h"

typedef enum {
    zero = 0,
    one,
    two,
    three,
    four
} NumberEnum;

@interface ChildClass : BaseClass
-(void)setValue:(NumberEnum)newValue;
-(NumberEnum)value;
@end

@implementation ChildClass

-(void)setValue:(NumberEnum)newValue
{
    [super setValue:(int)newValue];
    NSLog(@"Child Setter");
}

-(NumberEnum)value
{
    NSLog(@"Child Getter");
    return (NumberEnum)[super value];
}

@end

我使用以下代码测试此代码:

ChildClass* fred = [[ChildClass alloc] init];
NumberEnum barney;
fred.value = one;
barney = fred.value;
barney = [fred value];

XCode (4.5.2) 生成警告

属性“值”的类型与访问器“值”的类型不匹配

在这一行:

barney = fred.value;

运行代码时,我看到了 Child Setter 和 Getter 的日志消息。那么我应该怎么做才能消除这个警告,为什么我首先得到它?

4

2 回答 2

1

Your @property says int and the compiler is probably messing up with your methods. Try setting the @property type to NumberEnum and it should work (you will need to move the enum definition to your .h)

于 2012-11-23T14:06:31.070 回答
0

违规行:

barney = fred.value;

告诉编译器您要使用该属性value。由于您的子类没有定义它,它会上升到基类。它发现value导致警告的类型不同。

一个解决方案是将您的属性写为:

@property (nonatomic, assign) int value;

和枚举为:

enum {
    zero = 0,
    one,
    two,
    three,
    four
};
typedef int NumberEnum;

这样合成的属性方法和您自己的实现使用相同的数据类型。您可以使用符号值并且没有警告。

我建议NSUInteger改用它,因为它是 64 位友好的。

当然,如果您只是NumberEnum在基类中定义属性,那就更好了。

于 2012-11-25T15:55:32.990 回答