属性类型与访问者类型不匹配(子类化时)

时间:2012-11-23 14:02:46

标签: objective-c inheritance properties

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

我的基类是:

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

@implementation BaseClass
@synthesize value;
@end

由此我希望子类充当填充程序并将“value”从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)生成警告

  

属性'value'的类型与访问者'value'的类型不匹配

在此行

barney = fred.value;

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

2 个答案:

答案 0 :(得分:1)

您的@propertyint并且编译器可能会弄乱您的方法。尝试将@property类型设置为NumberEnum,它应该有效(您需要将枚举定义移动到.h)

答案 1 :(得分:0)

违规行:

barney = fred.value;

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

解决方案是将您的财产写为:

@property (nonatomic, assign) int value;

和枚举为:

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

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

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

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