我尝试编写自定义setter方法,但我失败并显示错误消息"Type of property 'pValue' does not match type of accessor 'setPValue:'"
。数组成功传递但我不明白错误消息。
我的.h文件:
@property (nonatomic, assign) double pValue;
- (double)getInverseCDFValue:(double)p;
- (void)setPValue:(NSArray*)aArray;
我的实施:
@synthesize pValue;
- (void)setPValue:(NSArray *)aArray {
double p = [[aArray objectAtIndex:22]doubleValue];
NSLog(@"p is: %f", p); //the value is written successfully
[self getInverseCDFValue:p]; //just calling another method for calculations
pValue = iCFDValue;
}
它适用于传递单个值,但不适用于数组。这在setter方法中是不允许的?
由于
答案 0 :(得分:1)
当您综合您的属性时,除非您的属性只读,否则Xcode将为您的属性生成setter和getter。在这种情况下,它将为您创建唯一的getter方法。所以,通过命名约定,假设你有一个属性名称 toto 哪个类型是double,你的setter将是
-(void)setToto:(double d)
。
但你可以做的是创建另一个方法来设置你的属性。但是,您需要将方法名称更改为其他名称。例如,
-(void)setTotoWithNSArray:(NSArray *)
。
答案 1 :(得分:1)
您已定义属性pValue
,其类型为double
。 Objective-C现在期望存在一个访问器和一个getter,其名称为:
- (double)pValue; // Getter
- (void)setPValue:(double)value; // Setter
您可以让Objective-C为您自动生成它们,或者您需要明确地提供它们。
现在,您提供的方法名称相同,但类型不同(NSArray
)。类型是不同的,这就是错误消息告诉你的内容:编译器认为该方法是属性的setter,但是你给它的类型错误。它告诉你,因为你违反了期望,所以在键值编码等某些环境中无法正确使用该属性。几乎在所有情况下,你所做的都被认为是一个错误。
您可以将pValue
属性设置为只读,我认为这会使警告消失,但仍然会很糟糕,因为类型差异令人困惑。相反,使用数组参数将setter重命名为其他内容:
- (void)setPValueFromArray:(NSArray *)anArray;