好的,我知道之前已经多次提到过这个问题了,但在检查了几个这样的问题之后,没有人谈到我在子类中覆盖基类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的日志消息。那么我应该做些什么来消除这个警告,为什么我首先得到它呢?
答案 0 :(得分:1)
您的@property
说int
并且编译器可能会弄乱您的方法。尝试将@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
,那就更好了。